Submission #1324623

#TimeUsernameProblemLanguageResultExecution timeMemory
1324623JungPSRegions (IOI09_regions)C++20
95 / 100
4281 ms172532 KiB
#include<bits/stdc++.h>
using namespace std;

int h[200007];
vector<int> home[25007];
vector<int> vec[200007];
vector<int> tour;
int timer=1;
pair<int,int> inout[200007];

vector<int> touridx[25007];
void dfs(int x){
    tour.push_back(h[x]);
    inout[x].first=timer;
    ++timer;
    for(auto i:vec[x]){
        if(inout[i].first) continue;
        dfs(i);
    }
    tour.push_back(0);
    inout[x].second=timer;
    ++timer;
}
int n,r,q;
map<pair<int,int>,int> dp;

bool visited[200007];
void predfs(int node,int pr,int prcnt){
    dp[{pr,h[node]}]+=prcnt;
    if(h[node]==pr) ++prcnt;
    visited[node]=true;
    for(auto i:vec[node]){
        if(visited[i]) continue;
        predfs(i,pr,prcnt);
    }
}
void precompute(){
    for(int rg=1;rg<=r;++rg){
        if(touridx[rg].size()<sqrt(n)) continue;
        memset(visited,0,sizeof(visited));
        predfs(1,rg,0);
    }
}

int dynamic(int r1,int r2){
    if(touridx[r1].size()>=sqrt(n)) return dp[{r1,r2}];

    int ans=0;
    for(auto i:home[r1]){
        ans+=upper_bound(touridx[r2].begin(),touridx[r2].end(),inout[i].second)-lower_bound(touridx[r2].begin(),touridx[r2].end(),inout[i].first);
    }
    return ans;
}
signed main(){
    cin >> n >> r >> q;
    cin >> h[1];
    for(int i=2;i<=n;++i){
        int s; cin >> s >> h[i];
        vec[i].push_back(s);
        vec[s].push_back(i); 
    }
    for(int i=1;i<=n;++i){
        home[h[i]].push_back(i);
    }
    tour.push_back(0);
    dfs(1);
    for(int i=0;i<tour.size();++i) touridx[tour[i]].push_back(i);
    precompute();
    while(q--){
        int r1,r2; cin >> r1 >> r2;
        /*
        int ans=0;
        
            */
        // Size log n - per r1 r2
        // Size * n - per r1 xx
        cout << dynamic(r1,r2) << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...