BZOJ2870 最长道路tree(并查集+LCA)
题意

(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)的更多相关文章
- BZOJ2870—最长道路tree
最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都 ...
- bzoj2870最长道路tree——边分治
简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 有几个不同的做法: 1.sort+并查集+树的直径.边从大到小加入 ...
- BZOJ2870: 最长道路tree
题解: 子树分治的做法可以戳这里:http://blog.csdn.net/iamzky/article/details/41120733 可是码量... 这里介绍另一种好写又快的方法. 我们还是一颗 ...
- [BZOJ2870]最长道路tree:点分治
算法一:点分治+线段树 分析 说是线段树,但是其实要写树状数组卡常. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register ...
- 【BZOJ2870】最长道路tree 点分治+树状数组
[BZOJ2870]最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来 ...
- hdu 2874 Connections between cities (并查集+LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu6074[并查集+LCA+思维] 2017多校4
看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...
- 【bzoj2870】最长道路tree 树的直径+并查集
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...
- 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 ...
随机推荐
- 最近邻插值法&线性插值&双线性插值&三线性插值
最近邻插值法nearest_neighbor是最简单的灰度值插值.也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值. 造成的空间偏移误差为像素单位,计算简单,但不够精确.但当图像 ...
- 使用easyui combobox初始化+在input中触发下拉框+获取值
效果图: 1.html <input id="alarmLeve" class="easyui-combobox" name="alarmLev ...
- BootStrap复习总结
Bootstrap3 复习总结: 1. 栅格系统: sm:768px md:992px lg:1200px (响应式布局) 1.横向分割页面的空间. 2.在分割的同时考虑到响应式. 内部实现是12列的 ...
- git--客户端管理工具初步使用
说点废话哈 小白一枚, 今年3月份进入自己的第一家公司, 开始成为前端中的一份子,好在公司里有位和我一同进来的一位老哥带着我,从老哥身上学到的知识不多,(因为和老哥只相处工作了三个月,因为家里的事情, ...
- web 安全主题
- Rsync和Sersync(企业实时同步方案)
注:本文章依据参考文章中的信息资料结合自己的实践操作而成 一.实验环境介绍 系统版本:Cent OS 7.4 X64 内核版本:3.10.0-693.5.2.el7.x86_64 系统采用最小化安装, ...
- php读写excel —— PhpSpreadsheet组件
前言 PhpSpreadsheet是一个纯PHP类库,它提供了一组类,允许您从不同的电子表格文件格式(如Excel和LibreOffice Calc)读取和写入.用PHP读取Excel.CSV文件 还 ...
- [luogu] P3202 [HNOI2009]通往城堡之路(贪心)
P3202 [HNOI2009]通往城堡之路 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有多少坎坷,不管城堡中的看守有多少厉害,不管救了公主之后公主会不会再被抓走,不管公主是否漂亮. ...
- Java基础学习总结(58)——JAVA堆、栈详解
关于堆栈的内容网上已经有很多资料了,这是我找的加上自己理解的一篇说明文: 一.内存区域类型 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制: 1. 栈:存放基本类型的变量数 ...
- UVALIVE 4256 Salesmen
Salesmen Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ...