답안 #490615

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
490615 2021-11-28T10:52:33 Z dooompy Regions (IOI09_regions) C++11
35 / 100
3159 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;
}
// Get answer for (a, b), sz[a] > BLOCK, sz[b] <= BLOCK
void genPar(int cur, int original, int cnt) {
    par[ind[original]][region[cur]] += cnt;
    cnt += (region[cur] == original);
    for (auto a : par[cur]) {
        genPar(a, original, cnt);
    }
}

// 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 35 ms 94568 KB Output is correct
2 Correct 36 ms 94628 KB Output is correct
3 Correct 39 ms 94680 KB Output is correct
4 Correct 41 ms 94668 KB Output is correct
5 Correct 44 ms 94660 KB Output is correct
6 Correct 50 ms 94720 KB Output is correct
7 Correct 56 ms 94748 KB Output is correct
8 Correct 60 ms 94676 KB Output is correct
9 Correct 71 ms 95056 KB Output is correct
10 Correct 104 ms 95148 KB Output is correct
11 Correct 135 ms 95296 KB Output is correct
12 Correct 160 ms 95804 KB Output is correct
13 Correct 190 ms 95452 KB Output is correct
14 Correct 229 ms 95976 KB Output is correct
15 Correct 270 ms 98412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 75 ms 131076 KB Execution killed with signal 9
2 Runtime error 71 ms 131076 KB Execution killed with signal 9
3 Runtime error 75 ms 131076 KB Execution killed with signal 9
4 Correct 267 ms 96080 KB Output is correct
5 Correct 395 ms 97544 KB Output is correct
6 Runtime error 76 ms 131076 KB Execution killed with signal 9
7 Runtime error 80 ms 131076 KB Execution killed with signal 9
8 Runtime error 82 ms 131076 KB Execution killed with signal 9
9 Correct 2144 ms 102320 KB Output is correct
10 Runtime error 97 ms 131076 KB Execution killed with signal 9
11 Correct 3159 ms 101628 KB Output is correct
12 Runtime error 120 ms 131076 KB Execution killed with signal 9
13 Runtime error 112 ms 131076 KB Execution killed with signal 9
14 Runtime error 120 ms 131076 KB Execution killed with signal 9
15 Runtime error 109 ms 131076 KB Execution killed with signal 9
16 Runtime error 102 ms 131076 KB Execution killed with signal 9
17 Runtime error 117 ms 131076 KB Execution killed with signal 9