Submission #763765

# Submission time Handle Problem Language Result Execution time Memory
763765 2023-06-22T20:29:49 Z izanbf Regions (IOI09_regions) C++14
90 / 100
8000 ms 76196 KB
#include <bits/stdc++.h>
using namespace std;

using vi = vector<int>;
using vvi = vector<vi>;

const int BIG = 1000;
vi r, tin, tout, big_id;
vvi adj, tins, touts, by_r;
vector<vector<long long>> dp;
int timer;

void euler(int u, int p) {
    tin[u] = timer++;
    tins[r[u]].push_back(tin[u]);
    for (int v : adj[u]) {
        if (v != p) euler(v, u);
    }
    tout[u] = timer++;
    touts[r[u]].push_back(tout[u]);
}

int count_in_range(const vi& v, int l, int r) {
    if (v.empty()) return 0;
    int i = upper_bound(v.begin(), v.end(), r) - v.begin();
    int j = upper_bound(v.begin(), v.end(), l) - v.begin();
    // cerr << "$$" << 1+rg << " " << l << " " << r << " " << j << " " << i << " " << i - j << endl;
    return i - j;
}

void precompute(int rg, int p, int u) {
    // cerr << "%" << 1+rg << " " << 1+u << endl;
    int rid = big_id[rg];
    cerr << 1+rg << " RID " << rid << " " << u << endl;
    dp[rid][u] = (r[u] == rg);
    for (int v : adj[u]) {
        if (v != p) {
            precompute(rg, u, v);
            dp[rid][u] += dp[rid][v];
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int N, R, Q;
    cin >> N >> R >> Q;

    r = tin = tout = vi(N);
    big_id = vi(R);
    adj = vvi(N);
    tins = touts = by_r = vvi(R);

    vi p(N, -1);

    cin >> r[0]; --r[0];
    by_r[r[0]].push_back(0);

    for (int i = 1; i < N; ++i) {
        cin >> p[i] >> r[i]; --p[i], --r[i];
        by_r[r[i]].push_back(i);
        adj[i].push_back(p[i]);
        adj[p[i]].push_back(i);
    }

    int bigs = 0;
    for (int rg = 0; rg < R; ++rg) {
        if (by_r[rg].size() >= BIG) big_id[rg] = bigs++;
    }

    dp = vector<vector<long long>>(bigs, vector<long long>(N));
    for (int rg = 0; rg < R; ++rg) {
        if (by_r[rg].size() >= BIG) precompute(rg, 0, 0);
    }

    timer = 1;
    euler(0, 0);

    // for (int x : tins[3-1]) cerr << x << " "; cerr << endl;

    // for (int i = 0; i < N; ++i) {
    //     cerr << 1+i << " " << 1+r[i] << "  " << tin[i] << " " << tout[i] << endl;
    // }

    // for (int i = 1; i < N; ++i) {
    //     cerr << 1+i << "(" << 1+r[i] << ")" 
    //     << " " << 1+p[i] << "(" << 1+r[p[i]] << ")" << endl;
    // }
    // cerr << endl << endl;

    map<pair<int,int>,long long> mem;

    while (Q--) {
        int r1, r2;
        cin >> r1 >> r2; --r1, --r2;
        // cerr << 1+r1 << " " << 1+r2 << endl;
        if (by_r[r1].size() < BIG and by_r[r2].size() >= BIG) { // r1 small r2 big
            long long cnt = 0;
            int rid = big_id[r2];
            for (int u : by_r[r1]) {
                cnt += dp[rid][u];
            }
            cout << cnt << endl;
        }
        else {
            if (not mem.count({r1,r2})) {
                long long cnt = 0;
                for (int u : by_r[r2]) {
                    cnt += count_in_range(tins[r1], 0, tin[u])
                         - count_in_range(touts[r1], 0, tin[u]);
                }
                mem[{r1,r2}] = cnt;
            }
            cout << mem[{r1,r2}] << endl;
        }
    }
}




# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 2 ms 256 KB Output is correct
4 Correct 5 ms 336 KB Output is correct
5 Correct 5 ms 388 KB Output is correct
6 Correct 15 ms 592 KB Output is correct
7 Correct 19 ms 600 KB Output is correct
8 Correct 25 ms 708 KB Output is correct
9 Correct 36 ms 1388 KB Output is correct
10 Correct 47 ms 1704 KB Output is correct
11 Correct 102 ms 2248 KB Output is correct
12 Correct 97 ms 3048 KB Output is correct
13 Correct 194 ms 3256 KB Output is correct
14 Correct 233 ms 4012 KB Output is correct
15 Correct 269 ms 7364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2560 ms 15092 KB Output is correct
2 Correct 5084 ms 23972 KB Output is correct
3 Correct 7219 ms 35812 KB Output is correct
4 Correct 254 ms 5316 KB Output is correct
5 Correct 197 ms 7804 KB Output is correct
6 Correct 418 ms 8032 KB Output is correct
7 Correct 718 ms 9328 KB Output is correct
8 Correct 1206 ms 18640 KB Output is correct
9 Correct 2328 ms 25288 KB Output is correct
10 Correct 4061 ms 34448 KB Output is correct
11 Correct 4651 ms 33440 KB Output is correct
12 Correct 3671 ms 32224 KB Output is correct
13 Correct 4199 ms 35332 KB Output is correct
14 Execution timed out 8012 ms 61264 KB Time limit exceeded
15 Correct 5703 ms 46344 KB Output is correct
16 Correct 5162 ms 55204 KB Output is correct
17 Execution timed out 8080 ms 76196 KB Time limit exceeded