rt,现在这个是AC代码,但是无法理解为什么
#define int long long
会re
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+2;
int id[N];
struct query
{
int l,r,idx;
friend bool operator < (query a,query b)
{
return id[a.l]==id[b.l]?a.r<b.r:id[a.l]<id[b.l];
}
}q[N];
int n,m,a[N],b[N],c[N],dfn[N],cnt,mx;
ll sum[N],ans[N];
vector<int> mp[N];
void dfs(int u,int f)
{
dfn[u]=++cnt;
b[cnt]=a[u];
q[u].l=cnt,q[u].idx=u;
for(int i=0;i<mp[u].size();i++)
{
int v=mp[u][i];
if(v==f)
continue;
dfs(v,u);
}
q[u].r=cnt;
}
void add(int x)
{
x=b[x];
sum[c[x]]-=x;
c[x]++;
sum[c[x]]+=x;
if(c[x]>mx)
mx++;
}
void del(int x)
{
x=b[x];
sum[c[x]]-=x;
c[x]--;
sum[c[x]]+=x;
if(!sum[c[x]+1]&&c[x]+1==mx)
mx--;
}
signed main()
{
scanf("%d",&n);
m=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
id[i]=(i-1)/m+1;
}
int u,v;
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&u,&v);
mp[u].push_back(v);
mp[v].push_back(u);
}
dfs(1,0);
sort(q+1,q+1+n);
int l=1,r=0;
for(int i=1;i<=n;i++)
{
int L=q[i].l,R=q[i].r;
while(l>L)
add(--l);
while(r<R)
add(++r);
while(l<L)
del(l++);
while(r>R)
del(r--);
ans[q[i].idx]=sum[mx];
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
}