Submission #427774

# Submission time Handle Problem Language Result Execution time Memory
427774 2021-06-14T22:09:45 Z Odavey Regions (IOI09_regions) C++17
30 / 100
8000 ms 65296 KB
//
// ~oisín~ C++ Template
//

#include                <bits/stdc++.h>
#define MX_N            200005
#define mp              make_pair
#define mod7            1000000007
#define modpi           314159
#define PI              3.141592653589793238
#define pb              push_back
#define FastIO          ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define All(a)          a.begin(),a.end()
#define fi              first
#define se              second
#define ll              long long int
#define ull             unsigned long long int

int kx[8]  =            {+2, +2, -2, -2, +1, +1, -1, -1};
int ky[8]  =            {+1, -1, +1, -1, +2, -2, +2, -2};
int d9x[9] =            {+1, +1, +1, +0, +0, +0, -1, -1, -1};
int d9y[9] =            {+1, +0, -1, +1, +0, -1, +1, +0, -1};
int dx4[4] =            {+0, +0, +1, -1};
int dy4[4] =            {+1, -1, +0, +0};

ll gcd(ull a, ull b){
    return (a==0)?b:gcd(b%a,a);
}

ll lcm(ull a, ull b){
    return a*(b/gcd(a,b));
}

const long long INF = 1e18;

using namespace std;

int N, R, Q;
int H[MX_N];
int p[MX_N];
vector<int> adj[MX_N];
vector<int> r[MX_N];
vector<pair<int, bool> > ord;

void dfs(int at){
    ord.pb({at, 0});
    r[H[at]].pb((int)ord.size()-1);
    for(int to : adj[at]){
        if(p[at] == to){
            continue;
        }
        dfs(to);
    }
    ord.pb({at, 1});
    r[H[at]].pb((int)ord.size()-1);
}

map<pair<int, int>, int> cache;
//int cache[5000][5000];

int main(){
    cin >> N >> R >> Q;
    int c = sqrt(N);
    cin >> H[0];
    --H[0];
    for(int i=1;i<N;++i){
        cin >> p[i] >> H[i];
        --p[i], --H[i];
        adj[p[i]].pb(i);
    }
    dfs(0);

    for(int j=0;j<R;++j){
        if((int)r[j].size() >= c){
            for(int i=0;i<R;++i){
                if(i == j){
                    continue;
                }
                vector<int> tmp;
                for(auto P : r[i]){
                    tmp.pb(P);
                }
                for(auto P : r[j]){
                    tmp.pb(P);
                }
                sort(All(tmp));
                int cntA = 0, cntB = 0;
                int ans = 0;
                for(auto ii : tmp){
                    auto P = ord[ii];
                    if(H[P.fi] == i){
                        if(P.se == 0){
                            ++cntA;
                        }else{
                            --cntA;
                        }
                    }else{
                        if(P.se == 0){
                            ++cntB;
                            ans += cntA;
                        }else{
                            --cntB;
                        }
                    }
                }
                cache[make_pair(i, j)] = ans;
                //cache[i][j] = ans;
            }
        }
    }

    for(int i=0;i<R;++i){
        if((int)r[i].size() >= c){
            for(int j=0;j<R;++j){
                if(i == j){
                    continue;
                }
                vector<int> tmp;
                for(auto P : r[i]){
                    tmp.pb(P);
                }
                for(auto P : r[j]){
                    tmp.pb(P);
                }
                sort(All(tmp));
                int cntA = 0, cntB = 0;
                int ans = 0;
                for(auto ii : tmp){
                    auto P = ord[ii];
                    if(H[P.fi] == i){
                        if(P.se == 0){
                            ++cntA;
                        }else{
                            --cntA;
                        }
                    }else{
                        if(P.se == 0){
                            ++cntB;
                            ans += cntA;
                        }else{
                            --cntB;
                        }
                    }
                }
                //cache[i][j] = ans;
                cache[make_pair(i, j)] = ans;
            }
        }
    }

    while(Q--){
        int r1, r2;
        cin >> r1 >> r2;
        --r1, --r2;
        if((int)r[r1].size() >= c || (int)r[r2].size() >= c){
            //cout << cache[r1][r2] << endl;
            cout << cache[make_pair(r1, r2)] << endl;
            cout.flush();
        }else{
            vector<int> tmp;
            for(auto P : r[r1]){
                tmp.pb(P);
            }
            for(auto P : r[r2]){
                tmp.pb(P);
            }
            sort(All(tmp));
            int cntA = 0, cntB = 0;
            int ans = 0;
            for(auto ii : tmp){
                auto P = ord[ii];
                if(H[P.fi] == r1){
                    if(P.se == 0){
                        ++cntA;
                    }else{
                        --cntA;
                    }
                }else{
                    if(P.se == 0){
                        ++cntB;
                        ans += cntA;
                    }else{
                        --cntB;
                    }
                }
            }
            cout << ans << endl;
            cout.flush();
        }
    }
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 9672 KB Output is correct
2 Correct 6 ms 9672 KB Output is correct
3 Correct 11 ms 9672 KB Output is correct
4 Correct 17 ms 9672 KB Output is correct
5 Correct 20 ms 9800 KB Output is correct
6 Correct 37 ms 9800 KB Output is correct
7 Correct 43 ms 9800 KB Output is correct
8 Correct 39 ms 9800 KB Output is correct
9 Correct 73 ms 10440 KB Output is correct
10 Correct 188 ms 10364 KB Output is correct
11 Correct 546 ms 12632 KB Output is correct
12 Correct 234 ms 11484 KB Output is correct
13 Correct 911 ms 13936 KB Output is correct
14 Correct 2020 ms 14244 KB Output is correct
15 Correct 3507 ms 19196 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6998 ms 18532 KB Output is correct
2 Correct 7042 ms 17164 KB Output is correct
3 Execution timed out 8074 ms 22792 KB Time limit exceeded
4 Execution timed out 8025 ms 61196 KB Time limit exceeded
5 Correct 4446 ms 51036 KB Output is correct
6 Execution timed out 8096 ms 25196 KB Time limit exceeded
7 Execution timed out 8077 ms 33192 KB Time limit exceeded
8 Execution timed out 8070 ms 35632 KB Time limit exceeded
9 Execution timed out 8039 ms 42104 KB Time limit exceeded
10 Execution timed out 8061 ms 53056 KB Time limit exceeded
11 Execution timed out 8007 ms 46656 KB Time limit exceeded
12 Execution timed out 8086 ms 23432 KB Time limit exceeded
13 Execution timed out 8021 ms 26712 KB Time limit exceeded
14 Execution timed out 8053 ms 25484 KB Time limit exceeded
15 Execution timed out 8071 ms 29120 KB Time limit exceeded
16 Execution timed out 8087 ms 65296 KB Time limit exceeded
17 Execution timed out 8095 ms 40016 KB Time limit exceeded