답안 #490616

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
490616 2021-11-28T10:53:48 Z dooompy Regions (IOI09_regions) C++11
35 / 100
3272 ms 131076 KB
#include "bits/stdc++.h"

using namespace std;

using ll = long long;

#define MAXN 200005
#define MAXR 25005
#define INF (long long)1e18
#define BLOCK 450

int n, r, q;
vector<int> region(MAXN);
vector<vector<int>> adj(MAXN);
int timer = 1;
int tin[MAXN], tout[MAXN];
vector<vector<int>> sorted(MAXR); // sorted[r] stores the nodes from region r in sorted order of {tin, tout}
vector<int> ind(MAXR);
vector<vector<int>> par(BLOCK, vector<int>(MAXR));
vector<vector<int>> child(BLOCK, vector<int>(MAXR));
vector<int> largeRegions;

void dfs(int i) {
    tin[i] = timer++;
    sorted[region[i]].push_back(i);

    for (auto a: adj[i]) {
        dfs(a);
    }

    tout[i] = timer - 1;
}

void genPar(int cur, int original, int cnt) {
    par[ind[original]][region[cur]] += cnt;
    int newcount = cnt + (region[cur] == original);
    for (auto a : par[cur]) {
        genPar(a, original, newcount);
    }
}

// Get answer for (a, b), sz[a] <= BLOCK, sz[b] > BLOCK

int genChild(int curr, int originalReg) {
    int sub = (region[curr] == originalReg);

    for(auto child : adj[curr]) {
        sub += genChild(child, originalReg);
    }

    child[ind[originalReg]][region[curr]] += sub;
    return sub;
}

bool isAnc(int a, int b) {
    return tin[a] <= tin[b] && tout[b] <= tout[a];
}

int getAns(int reg1, int reg2) {
    int l = 0, r = 0;
    int ans = 0;
    stack<int> st;

    while (l < sorted[reg1].size() || r < sorted[reg2].size()) {
        if ((l < sorted[reg1].size()) && (r == sorted[reg2].size() || tin[sorted[reg1][l]] < tin[sorted[reg2][r]])) {
            while (!st.empty() && !isAnc(st.top(), sorted[reg1][l])) {
                st.pop();
            }

            st.push(sorted[reg1][l]);
            l++;
        } else {
            while (!st.empty() && !isAnc(st.top(), sorted[reg2][r])) {
                st.pop();
            }

            ans += st.size();
            r++;
        }
    }

    return ans;
}



int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
//    freopen("", "r", stdin);
//    freopen("", "w", stdout);
    int n, r, q; cin >> n >> r >> q;
    cin >> region[1];

    for (int i = 2; i <= n; i++) {
        int s; cin >> s >> region[i];
        adj[s].push_back(i);
    }

    dfs(1);

    int idx = 0;

    for (int i = 1; i <= r; i++) {
        if (sorted[i].size() > BLOCK) {
            largeRegions.push_back(i);
            ind[i] = idx++;
        }
    }

    for (auto a : largeRegions) {
        genPar(1, a, 0);
        genChild(1, a);
    }

    for (int i = 0; i < q; i++) {
        int a, b; cin >> a >> b;

        if (sorted[a].size() <= BLOCK && sorted[b].size() <= BLOCK) {
            cout << getAns(a, b) << endl;
            continue;
        }

        if (sorted[a].size() > BLOCK) {
            cout << par[ind[a]][b] << endl;
        } else {
            cout << child[ind[b]][a] << endl;
        }
    }
}

Compilation message

regions.cpp: In function 'int getAns(int, int)':
regions.cpp:64:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |     while (l < sorted[reg1].size() || r < sorted[reg2].size()) {
      |            ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp:64:41: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |     while (l < sorted[reg1].size() || r < sorted[reg2].size()) {
      |                                       ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp:65:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         if ((l < sorted[reg1].size()) && (r == sorted[reg2].size() || tin[sorted[reg1][l]] < tin[sorted[reg2][r]])) {
      |              ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp:65:45: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         if ((l < sorted[reg1].size()) && (r == sorted[reg2].size() || tin[sorted[reg1][l]] < tin[sorted[reg2][r]])) {
      |                                           ~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 94560 KB Output is correct
2 Correct 37 ms 94680 KB Output is correct
3 Correct 39 ms 94644 KB Output is correct
4 Correct 41 ms 94592 KB Output is correct
5 Correct 42 ms 94704 KB Output is correct
6 Correct 45 ms 94752 KB Output is correct
7 Correct 63 ms 94712 KB Output is correct
8 Correct 71 ms 94660 KB Output is correct
9 Correct 58 ms 95160 KB Output is correct
10 Correct 131 ms 95012 KB Output is correct
11 Correct 170 ms 95384 KB Output is correct
12 Correct 185 ms 95744 KB Output is correct
13 Correct 151 ms 95448 KB Output is correct
14 Correct 254 ms 95976 KB Output is correct
15 Correct 274 ms 98484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 98 ms 131076 KB Execution killed with signal 9
2 Runtime error 89 ms 131076 KB Execution killed with signal 9
3 Runtime error 76 ms 131076 KB Execution killed with signal 9
4 Correct 294 ms 96004 KB Output is correct
5 Correct 363 ms 97564 KB Output is correct
6 Runtime error 72 ms 131076 KB Execution killed with signal 9
7 Runtime error 102 ms 131076 KB Execution killed with signal 9
8 Runtime error 85 ms 131076 KB Execution killed with signal 9
9 Correct 1770 ms 102320 KB Output is correct
10 Runtime error 104 ms 131076 KB Execution killed with signal 9
11 Correct 3272 ms 101628 KB Output is correct
12 Runtime error 129 ms 131076 KB Execution killed with signal 9
13 Runtime error 124 ms 131076 KB Execution killed with signal 9
14 Runtime error 128 ms 131076 KB Execution killed with signal 9
15 Runtime error 109 ms 131076 KB Execution killed with signal 9
16 Runtime error 101 ms 131076 KB Execution killed with signal 9
17 Runtime error 108 ms 131076 KB Execution killed with signal 9