dsu on tree WA #8求助
查看原帖
dsu on tree WA #8求助
275860
___A__楼主2024/7/22 09:10
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],siz[N],h[N],T,node,ans[N],dep[N];
set<int>num[N];
stack<int>del;
map<string,int>mp;
vector<int>g[N],root;
vector<pair<int,int>>query[N];
int get(string name){
    if(mp[name]){
        return mp[name];
    }
    return mp[name]=++node;
}
void init(int u){
    siz[u]=1;
    for(int v:g[u]){
        dep[v]=dep[u]+1,init(v),siz[u]+=siz[v];
        if(siz[h[u]]<siz[v]){
            h[u]=v;
        }
    }
}
void clear(){
    while(del.size()){
        int u=del.top();
        num[u].clear(),del.pop();
    }
}
void ins(int u){
    num[dep[u]].insert(a[u]),del.push(dep[u]);
}
void add(int u){
    ins(u);
    for(int v:g[u]){
        add(v);
    }
}
void solve(int u){
    for(int v:g[u]){
        if(v!=h[u]){
            solve(v),clear();
        }
    }
    if(h[u]){
        solve(h[u]);
    }
    for(int v:g[u]){
        if(v!=h[u]){
            add(v);
        }
    }
    ins(u);
    for(auto [val,id]:query[u]){
        ans[id]=num[val].size();
    }
}
int main(){
    cin>>n;
    for(int i=1,f;i<=n;i++){
        string name;
        cin>>name>>f,a[i]=get(name);
        if(!f){
            root.push_back(i);
        }
        else{
            g[f].push_back(i);
        }
    }
    cin>>T;
    for(int i:root){
        init(i);
    }
    for(int u,x,i=1;i<=T;i++){
        cin>>u>>x,query[u].push_back({x+dep[u],i});
    }
    for(int i:root){
        solve(i);
    }
    for(int i=1;i<=T;i++){
        cout<<ans[i]<<'\n';
    }
}
2024/7/22 09:10
加载中...