[dsu on tree] Codeforces #600E. Lomsat gelral
来源:互联网 发布:可靠性软件 编辑:程序博客网 时间:2024/06/05 02:09
所谓dsu on tree,就是树上的启发式合并,处理出重儿子然后搞就行了。树的特殊性会使写起来比数据结构启发式合并方便一点。只需维护一个数据结构,支持插入删除单个元素。
这题就是模板题啦…
#include<cstdio>#include<vector>#include<algorithm>using namespace std;typedef long long LL;const int maxn=100005,maxe=200005;int n,a[maxn],sz[maxn],hvy[maxn],fir[maxn],nxt[maxe],son[maxe],tot;LL ans[maxn],cnt[maxn],sum[maxn],_max;void add(int x,int y){ son[++tot]=y; nxt[tot]=fir[x]; fir[x]=tot;}void dfs_info(int x,int pre){ sz[x]=1; for(int j=fir[x];j;j=nxt[j]) if(son[j]!=pre){ dfs_info(son[j],x); sz[x]+=sz[son[j]]; if(sz[hvy[x]]<sz[son[j]]) hvy[x]=son[j]; }}void Push(int x){ sum[cnt[x]]-=x; cnt[x]++; sum[cnt[x]]+=x; if(cnt[x]>_max) _max=cnt[x];}void Del(int x){ sum[cnt[x]]-=x; cnt[x]--; sum[cnt[x]]+=x; if(!sum[_max]) _max--;}void dfs_Push(int x,int pre){ Push(a[x]); for(int j=fir[x];j;j=nxt[j]) if(son[j]!=pre) dfs_Push(son[j],x);}void dfs_Del(int x,int pre){ Del(a[x]); for(int j=fir[x];j;j=nxt[j]) if(son[j]!=pre) dfs_Del(son[j],x);}void dfs(int x,int pre){ for(int j=fir[x];j;j=nxt[j]) if(son[j]!=pre) if(son[j]!=hvy[x]) dfs(son[j],x), dfs_Del(son[j],x); if(hvy[x]) dfs(hvy[x],x); Push(a[x]); for(int j=fir[x];j;j=nxt[j]) if(son[j]!=pre) if(son[j]!=hvy[x]) dfs_Push(son[j],x); ans[x]=sum[_max];}int main(){ freopen("cf600E.in","r",stdin); freopen("cf600E.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]), sum[0]+=a[i]; for(int i=1;i<=n-1;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs_info(1,1); dfs(1,1); for(int i=1;i<=n;i++) printf("%I64d ",ans[i]); return 0;}
阅读全文
1 0
- codeforces 600 E. Lomsat gelral (dsu on the tree)
- Codeforces 600E Lomsat gelral (DSU on Tree)
- [dsu on tree] Codeforces #600E. Lomsat gelral
- codeforces 600E. Lomsat gelral [dsu on tree(树上启发式合并)]
- codeforces600E. Lomsat gelral(dsu on tree)
- 【dsu on tree】Codeforces600E[Lomsat gelral]题解
- Codeforces 600E Lomsat gelral
- Codeforces 600E Lomsat gelral
- [Codeforces600E]Lomsat gelral(dsu on the tree)
- [codeforces600E]Lomsat gelral(dsu on the tree+讲解)
- CodeForces 600E Lomsat gelral 暴力
- Codeforces 600E Lomsat gelral(启发式合并)
- [Dsu on tree]CodeForces 600 E
- codeforces 660E Lomsat gelral
- codeforces 600E. Lomsat gelral(教育场 树形dp)
- CodeForces 600E Lomsat gelral(树形dp+启发式合并)
- Codeforces 600E Lomsat gelral 树上启发式合并
- Codeforces 600E. Lomsat gelral(树上启发式合并)
- P1256 显示图像 【队列维护bfs】
- C# 生成不重复的随机数
- android的surfaceflinger原理讲解
- 防火墙管理器二:iptables
- 计算机网络系列(4)之应用层SubNet and DHCP
- [dsu on tree] Codeforces #600E. Lomsat gelral
- 过滤器filter
- c语言操作符总结
- tensorflow 学习笔记 2
- book类练习题
- 查找数组(不限维数)中的最大元素和最小元素
- "xxx" is not translated in "en" (English)
- c++中int a[10]和int a=new int[10]]有什么区别
- Mysql集群和一主多从的方案实现(二)