Submission #427772

# Submission time Handle Problem Language Result Execution time Memory
427772 2021-06-14T22:06:11 Z Odavey Regions (IOI09_regions) C++17
30 / 100
8000 ms 117224 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){
            cout << cache[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 9 ms 9672 KB Output is correct
4 Correct 11 ms 9800 KB Output is correct
5 Correct 17 ms 9920 KB Output is correct
6 Correct 31 ms 9800 KB Output is correct
7 Correct 39 ms 9800 KB Output is correct
8 Correct 51 ms 9800 KB Output is correct
9 Correct 70 ms 10568 KB Output is correct
10 Correct 184 ms 10468 KB Output is correct
11 Correct 481 ms 12204 KB Output is correct
12 Correct 179 ms 13168 KB Output is correct
13 Correct 942 ms 12852 KB Output is correct
14 Correct 2167 ms 12820 KB Output is correct
15 Correct 3674 ms 16784 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6970 ms 17208 KB Output is correct
2 Correct 7489 ms 15784 KB Output is correct
3 Execution timed out 8086 ms 20040 KB Time limit exceeded
4 Execution timed out 8092 ms 89396 KB Time limit exceeded
5 Correct 4314 ms 112008 KB Output is correct
6 Runtime error 388 ms 67756 KB Execution killed with signal 11
7 Runtime error 405 ms 70492 KB Execution killed with signal 11
8 Runtime error 467 ms 85036 KB Execution killed with signal 11
9 Runtime error 393 ms 83964 KB Execution killed with signal 11
10 Runtime error 475 ms 97924 KB Execution killed with signal 11
11 Runtime error 478 ms 82956 KB Execution killed with signal 11
12 Execution timed out 8053 ms 34996 KB Time limit exceeded
13 Runtime error 371 ms 92128 KB Execution killed with signal 11
14 Runtime error 1159 ms 87400 KB Execution killed with signal 11
15 Execution timed out 8028 ms 40036 KB Time limit exceeded
16 Runtime error 439 ms 117224 KB Execution killed with signal 11
17 Runtime error 1144 ms 114328 KB Execution killed with signal 11