【CodeForces】915 F. Imbalance Value of a Tree 并查集
2018-01-15 14:09
489 查看
【题目】F. Imbalance Value of a Tree
【题意】给定n个点的带点权树,求所有路径极差的和。n,ai<=10^6
【算法】并查集
【题解】先计算最大值的和,按点权从小到大排序,每个点x和相邻的已访问点的点集形成的路径的最大值都是a[x],因为已访问过的点点权较小,然后用并查集并起来。复杂度O(n log n)。
#include<cstdio> #include<algorithm> using namespace std; const int N=1000010; struct edge{int v,from;}e[N*2]; int n,a ,b ,fa ,first ,tot,sz ; long long ans; int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;} bool cmp(int x,int y){return a[x]<a[y];} void solve(){ for(int i=1;i<=n;i++)fa[i]=0,b[i]=i; sort(b+1,b+n+1,cmp); for(int z=1;z<=n;z++){ int x=b[z]; fa[x]=x;sz[x]=1; for(int i=first[x];i;i=e[i].from)if(fa[e[i].v]){ int y=find(e[i].v); ans+=1ll*sz[x]*sz[y]*a[x]; sz[x]+=sz[y]; fa[y]=x; } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); insert(u,v);insert(v,u); } solve(); for(int i=1;i<=n;i++)a[i]=-a[i]; solve(); printf("%lld",ans); return 0; }View Code
相关文章推荐
- Imbalance Value of a Tree (CodeForces 915F)
- Educational Codeforces Round 36 (Rated for Div. 2) F. Imbalance Value of a Tree(并查集)
- [CF915F]Imbalance Value of a Tree
- 【CodeForces】576 B. Invariance of Tree
- CodeForces 698B - Fix a Tree(并查集)
- codeforces 593 D. Happy Tree Party (LCA + 并查集)
- Codeforces 690F1 - Tree of Life (easy)
- Tree of Life(easy) Codeforces 690F1
- codeforces 690F2 Tree of Life (medium) 树hash
- Codeforces 698C. Fix a Tree (并查集)
- CodeForces 699D—— Fix a Tree(并查集判断环)
- Codeforces_764_C. Timofey and a tree_(并查集)(dfs)
- codeforces 690 F3 Tree of Life (hard) 树hash
- [树的直径] Codeforces 804D Round #411 (Div. 1) D. Expected diameter of a tree
- Codeforces 690F1 - Tree of Life (easy)
- LeetCode--Maximum Depth of Binary Tree (检索二叉树的最大深度)Python
- Lowest Common Ancestor of a Binary Search Tree
- 104、Maximum Depth of Binary Tree
- SSM框架搭建系列(二)--No converter found for return value of type
- Codeforces 600E Lomsat gelral [dsu on tree(树上启发式合并)]