站外题神秘WA求调(玄关)
  • 板块学术版
  • 楼主CQBZ_ZJYjoe
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/2/7 19:05
  • 上次更新2025/2/7 21:30:30
查看原帖
站外题神秘WA求调(玄关)
592080
CQBZ_ZJYjoe楼主2025/2/7 19:05

题面

WA四个点。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,m,rt,a[maxn],b[maxn],siz[maxn],son[maxn],cnt[maxn],ans[maxn],sum;
vector<int> edge[maxn];
void dfs1(int x,int p)
{
    siz[x]=1;
    son[x]=-1;
    for (auto v:edge[x])
    {
        if (v==p)
            continue;
        dfs1(v,x);
        siz[x]+=siz[v];
        if (son[x]==-1||siz[son[x]]<siz[v])
            son[x]=v;
    }
}
void add(int u,int p,int x)
{
    cnt[a[u]]+=x;
    if (cnt[a[u]]==1)
        sum++;
    if (!cnt[a[u]])
        sum--;
    for (auto v:edge[u])
    {
        if (v==p)
            continue;
        add(v,u,x);
    }
}
void dfs2(int x,int p,int kp)
{
    for (auto v:edge[x])
    {
        if (v==p||v==son[x])
            continue;
        dfs2(v,x,0);
    }
    if (son[x]!=-1)
        dfs2(son[x],x,1);
    cnt[a[x]]++;
    if (cnt[a[x]]==1)
        sum++;
    for (auto v:edge[x])
    {
        if (v==p||v==son[x])
            continue;
        add(v,x,1);
    }
    ans[x]=sum;
    if (!kp)
        add(x,p,-1);
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>a[i],b[i]=a[i];
    for (int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        edge[x].push_back(y);
        edge[y].push_back(x);
    }
    sort(b+1,b+n+1);
    int cnt=unique(b+1,b+n+1)-(b+1);
    for (int i=1;i<=n;i++)
        a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
    dfs1(1,0);
    dfs2(1,0,1);
    for (int i=1;i<=n;i++)
        cout<<ans[i]<<' ';
    return 0;
}
2025/2/7 19:05
加载中...