蒟蒻求调
查看原帖
蒟蒻求调
381053
CQ_Bab楼主2024/4/1 19:23

Rt.

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define rep1(i,x,y) for(register int i=x;i>=y;--i)
#define in(x) scanf("%lld",&x)
#define fire signed
#define il inline
il void print(int x) {
	if(x<0) putchar('-'),x=-x;
	if(x>=10) print(x/10);
	putchar(x%10+'0');
}
int T=1;
const int N=1e5+10;
vector<int>v[N];
int n;
struct node{
	int Max,now;
	int l,r; 
}tr[N<<5];
void up(int x) {
	tr[x].Max=max(tr[tr[x].l].Max,tr[tr[x].r].Max);
	int xx=false;
	if(tr[x].Max==tr[tr[x].l].Max) xx+=tr[tr[x].l].now;
	if(tr[x].Max==tr[tr[x].r].Max) xx+=tr[tr[x].r].now;
	tr[x].now=xx;
}
int tot;
void modify(int &u,int l,int r,int k) {
	if(!u) u=++tot;
	if(l==r) {
		tr[u].Max++;
		tr[u].now+=k;
		return;
	}
	int mid=l+r>>1;
	if(mid>=k) modify(tr[u].l,l,mid,k);
	else modify(tr[u].r,mid+1,r,k);
	up(u);
}
int merge(int a,int b,int l,int r) {
	if(!a||!b) return a+b;
	if(l==r) {
		tr[a].Max+=tr[b].Max;
		tr[a].now=l*tr[a].Max;
		return a;
	}
	int mid=l+r>>1;
	tr[a].l=merge(tr[a].l,tr[b].l,l,mid);
	tr[a].r=merge(tr[a].r,tr[b].r,mid+1,r);
	up(a);
	return a;
}
int rt[N],res[N];
void dfs(int x,int fa) {
	for(auto to:v[x]) {
		if(to==fa) continue;
		dfs(to,x);
		merge(rt[x],rt[to],1,N);
	}
	res[x]=tr[rt[x]].now;
}
void solve() {
	in(n);
	rep(i,1,n) {
		int x;
		in(x);
		modify(rt[i],1,N,x);
	}
	rep(i,1,n-1) {
		int x,y;
		in(x),in(y);
		v[x].push_back(y);
		v[y].push_back(x); 
	}
	dfs(1,0);
	rep(i,1,n) printf("%lld ",res[i]);
	return;
}
fire main() {
	while(T--) {
		solve();
	}
	return false;
}

2024/4/1 19:23
加载中...