Codeforces 600E (dsu on tree)

阅读: 评论:0

Codeforces 600E (dsu on tree)

Codeforces 600E (dsu on tree)

传送门

题意:

求以 i i i为根的子树中,出现颜色次数最多的颜色编号之和。

思路:

先考虑最暴力的解法:枚举每个节点,dfs其子树暴力求解,复杂度 O ( n 2 ) O(n^2) O(n2)
我们可以先重链剖分出每个节点的重儿子,处理轻链的答案然后合并到重儿子上,更新答案后消除轻儿子对答案的贡献,复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector> 
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x)  x&-x;  
#define debugint(name,x) printf("%s: %dn",name,x);
#define debugstring(name,x) printf("%s: %sn",name,x);
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-6;
const int maxn = 1e5+5;
const ll mod = 1e9+7;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}vector<int>g[maxn];
ll kind[maxn],ans[maxn],n,mx,sum,col[maxn],son[maxn],sz[maxn],wson;
void dfs(int u,int fa){  //重链剖分 sz[u] = 1;for(auto v:g[u]){if(v == fa) continue;dfs(v,u);sz[u] += sz[v];if(sz[v] > sz[son[u]]){son[u] = v;}}
}
void solve(int u,int fa,int val){kind[col[u]] += val;if(kind[col[u]] > mx){mx = kind[col[u]];sum = col[u];}else if(kind[col[u]] == mx){sum += col[u];}for(auto v:g[u]){if(v == fa || v == wson) continue;solve(v,u,val);}}
void dfsans(int u,int fa,int opt){ //opt表示是否要消除贡献 for(auto v:g[u]){if(v == fa) continue;//dfsans(v,u,opt);if(v != son[u]){dfsans(v,u,0);  //处理轻链 }}if(son[u]){dfsans(son[u],u,1); //处理重链wson = son[u];}solve(u,fa,1);  //处理轻链的答案 wson = 0;ans[u] = sum;if(!opt) solve(u,fa,-1),mx = 0,sum = 0; //消除当前节点轻链的贡献 }
int main(){scanf("%d",&n);for(int i = 1; i <= n; i++)scanf("%lld",&col[i]);for(int i = 1; i < n; i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}dfs(1,0);dfsans(1,0,0);for(int i = 1; i <= n; i++)printf("%lld ",ans[i]);} 

本文发布于:2024-01-31 09:28:49,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170666453427534.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Codeforces   tree   dsu
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23