제출 #1327605

#제출 시각아이디문제언어결과실행 시간메모리
1327605hectormedranoRegions (IOI09_regions)C++20
100 / 100
6796 ms35560 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<vector<ll>> v;
vector<ll> r;
vector<vector<pair<ll, bool>>> h;
ll t = 0;

void DFS(ll y){
    h[r[y]].push_back({t, true});
    t++;
    for(ll z : v[y]){
        DFS(z);
    }
    h[r[y]].push_back({t, false});
    t++;
}

int main() {
	cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    ll N, R, Q;
    cin>>N>>R>>Q;
    v.resize(N);
    r.resize(N);
    h.resize(R);
    cin>>r[0];
    r[0]--;
    for(ll i=1;i<N;i++){
        ll S;
        cin>>S>>r[i];
        S--; r[i]--;
        v[S].push_back(i);
    }
    DFS(0);
    /*for(ll i=0;i<R;i++){
        for(pair<ll, ll> x : h[i]){
            cout<<x.first<<" ";
        }
        cout<<endl;
    }*/
    while(Q--){
        ll r1, r2;
        cin>>r1>>r2;
        r1--; r2--;
        ll p1, p2, c, ans;
        p1 = p2 = c = ans = 0;
        while(!(p1 == h[r1].size() and p2 == h[r2].size())){
            bool b = true;
            if(p1 == h[r1].size()){b = false;}
            else{
                if(p2 != h[r2].size() and h[r1][p1] > h[r2][p2]){b = false;}
            }
            if(b){
                if(h[r1][p1].second){c++;}
                else{c--;}
                p1++;
            } else {
                ans += c;
                p2++;
            }
        }
        cout<<ans/2<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...