题意

(n<=50000)

题解

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const long long N=;
long long cnt,head[N];
long long sum[N],dep[N],f[N][];
long long fa[N];
long long n,a[N],b[N],book[N],ans;
struct edge{
long long to,nxt;
}e[N*];
struct node{
long long w,id;
}c[N];
void add(long long u,long long v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dfs(long long u,long long ff,long long deep,long long w){
sum[u]=w;
f[u][]=ff;
dep[u]=deep;
for(long long i=head[u];i;i=e[i].nxt){
long long v=e[i].to;
if(v==ff)continue;
dfs(v,u,deep+,w+);
}
}
bool cmp(node a,node b){
return a.w>b.w;
}
long long find(long long x){
if(fa[x]==x)return x;
else return fa[x]=find(fa[x]);
}
long long getlca(long long x,long long y){
if(dep[x]<dep[y])swap(x,y);
for(long long i=;i>=;i--){
if(dep[f[x][i]]>=dep[y]){
x=f[x][i];
}
}
if(x==y)return x;
for(long long i=;i>=;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
}
return f[x][];
}
long long getline(long long x,long long y){
long long LCA=getlca(x,y);
return sum[x]+sum[y]-sum[LCA]*+;
}
void merge(long long x,long long y){
long long tmp=,cx,cy,len;
len=getline(a[x],b[x]);if(len>tmp){cx=a[x];cy=b[x];tmp=len;}
len=getline(a[y],b[y]);if(len>tmp){cx=a[y];cy=b[y];tmp=len;}
len=getline(a[x],a[y]);if(len>tmp){cx=a[x];cy=a[y];tmp=len;}
len=getline(b[x],b[y]);if(len>tmp){cx=b[x];cy=b[y];tmp=len;}
len=getline(a[x],b[y]);if(len>tmp){cx=a[x];cy=b[y];tmp=len;}
len=getline(a[y],b[x]);if(len>tmp){cx=a[y];cy=b[x];tmp=len;}
fa[y]=x;
a[x]=cx;
b[x]=cy;
}
int main(){
scanf("%lld",&n);
for(long long i=;i<=n;i++){
scanf("%lld",&c[i].w);
c[i].id=i;
}
for(long long i=;i<n;i++){
long long u;long long v;
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
}
for(long long i=;i<=n;i++){
a[i]=b[i]=i;fa[i]=i;
}
dfs(,,,);
for(long long i=;i<=;i++){
for(long long j=;j<=n;j++){
f[j][i]=f[f[j][i-]][i-];
}
}
sort(c+,c++n,cmp);
for(long long i=;i<=n;i++){
long long u=c[i].id;
book[u]=;
for(long long j=head[u];j;j=e[j].nxt){
long long v=e[j].to;
if(book[v]==)continue;
merge(find(u),find(v));
}
ans=max(ans,c[i].w*getline(a[u],b[u]));
}
printf("%lld",ans);
return ;
}

BZOJ2870 最长道路tree(并查集+LCA)的更多相关文章

  1. BZOJ2870—最长道路tree

    最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都 ...

  2. bzoj2870最长道路tree——边分治

    简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数.   有几个不同的做法: 1.sort+并查集+树的直径.边从大到小加入 ...

  3. BZOJ2870: 最长道路tree

    题解: 子树分治的做法可以戳这里:http://blog.csdn.net/iamzky/article/details/41120733 可是码量... 这里介绍另一种好写又快的方法. 我们还是一颗 ...

  4. [BZOJ2870]最长道路tree:点分治

    算法一:点分治+线段树 分析 说是线段树,但是其实要写树状数组卡常. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register ...

  5. 【BZOJ2870】最长道路tree 点分治+树状数组

    [BZOJ2870]最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来 ...

  6. hdu 2874 Connections between cities (并查集+LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  7. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  8. 【bzoj2870】最长道路tree 树的直径+并查集

    题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...

  9. Hdu.1325.Is It A Tree?(并查集)

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

随机推荐

  1. ubantu上搭建hive环境

    上次我们在ubantu上安装了hadoop,那我们现在再进一步,开始我们的学习之旅--hive板块吧! 第一步:准备! 软件: I.一个搭建好的hadoop环境 II.hive的bin文件(前往apa ...

  2. PAT 天梯赛练习集 L2-016. 愿天下有情人都是失散多年的兄妹

    题目链接:https://www.patest.cn/contests/gplt/L2-016 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母. ...

  3. IOS - IOS之同步请求、异步请求、GET请求、POST请求(转载)

    转载:http://www.open-open.com/lib/view/open1355055986679.html 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务 ...

  4. HDU 5421 Victor and String (回文自动机)

    题目大意:让你维护一个字符串,支持在开头结尾插入字符,以及查询本质不同的回文串数量以及回文串总数量 开头结尾都维护一个$last$指针,如果插入新字符后,整个串是一个回文串,就把另一个$last$赋值 ...

  5. 前端实现input[type='file']上传图片预览效果

    众所周知JavaScript在设计上处于安全角度考虑,是不允许读写本地文件的(原因请自行百度): 但是在实际项目应用中,经常会使用到上传图片,并且可以让用户直接预览图片.对于此种做法有两种方法可以实现 ...

  6. 【codeforces 452D】Washer, Dryer, Folder

    [题目链接]:http://codeforces.com/problemset/problem/452/D [题意] 洗衣服有3个步骤,洗,干,叠; 有对应的3种洗衣机,分别有n1,n2,n3台,然后 ...

  7. Android TextView 横向滚动(跑马灯效果)

    Android TextView 中当文字比較多时希望它横向滚动显示,以下是一种亲測可行的方法. 效果图: 1.自己定义TextView,重写isFocused()方法返回true,让自己定义Text ...

  8. node-webkit 主页面和 iframe 页通讯

    <html lang="en-US"> <head> <title>Hello World!</title> <style&g ...

  9. easyui编辑器(kindeditor-4.1.10)

    //1  重写kindedit    -建一个js文件 easyui_kindeditor.js (function ($, K) {     if (!K)         throw " ...

  10. bzoj4519: [Cqoi2016]不同的最小割(分治最小割)

    4519: [Cqoi2016]不同的最小割 题目:传送门 题解: 同BZOJ 2229 基本一样的题目啊,就最后用set记录一下就ok 代码: #include<cstdio> #inc ...