제출 #1343418

#제출 시각아이디문제언어결과실행 시간메모리
1343418WarinchaiRegions (IOI09_regions)C++20
50 / 100
2428 ms20072 KiB
#include<bits/stdc++.h>
using namespace std;

vector<int>adj[200005];
int ar[200005];
int cnt[200005];
int ans[505][200005];
int tot;
int X=400;
vector<int>v[200005];
vector<int>v2[200005];
int in[200005];
int out[200005];
int tme=0;

void dfs(int u,int t){
    ans[t][ar[u]]+=tot;
    if(ar[u]==t)tot++;
    for(auto x:adj[u])dfs(x,t);
    if(ar[u]==t)tot--;
}

void efs(int u){
    in[u]=++tme;
    //cerr<<"u:"<<u<<" "<<in[u]<<"\n";
    v[ar[u]].push_back(tme);
    v2[ar[u]].push_back(u);
    for(auto x:adj[u])efs(x);
    out[u]=tme;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,r,q;cin>>n>>r>>q;
    for(int i=1;i<=n;i++){
        if(i==1)cin>>ar[i];
        else{
            int x;cin>>x;
            adj[x].push_back(i);
            cin>>ar[i];
            cnt[ar[i]]++;
        }
    }
    for(int i=1;i<=r;i++){
        if(cnt[i]>X){
            dfs(1,i);
        }
    }
    efs(1);
    for(int i=0;i<q;i++){
        int r1,r2;cin>>r1>>r2;
        if(cnt[r1]>X){
            cout<<ans[r1][r2]<<endl;
        }else{
            int rans=0;
            for(auto x:v2[r1]){
                //cerr<<"add:"<<in[x]+1<<" "<<out[x]<<"\n";
                int st=upper_bound(v[r2].begin(),v[r2].end(),in[x])-v[r2].begin()+1;
                int en=upper_bound(v[r2].begin(),v[r2].end(),out[x])-v[r2].begin();
                rans+=max(0,en-st+1);
            }
            cout<<rans<<endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...