답안 #523502

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523502 2022-02-07T17:49:28 Z Vladth11 Regions (IOI09_regions) C++14
25 / 100
8000 ms 78416 KB
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
 
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;
 
const int NMAX = 400005;
const int VMAX = 21;
const int INF = (1LL << 60);
const int MOD = 1000000007;
const int BLOCK = 447;
const int base = 31;
const int nr_of_bits = 21;
const int MMAX = 500;
 
vector <int> v[NMAX], vertices[NMAX];
vector <pii> lista[NMAX];
int stamp;
int n, R, Q;
int sol[501][501];
int precalc[501][501];
int region[NMAX];
int bigR[NMAX];
int smallR[NMAX];
int bigIdx[NMAX];
int smallIdx[NMAX];
int cati[NMAX];
int stiva[NMAX];
int vf;
int countAbove[MMAX];
int timestamp;
pii timp[NMAX];
int preorder[NMAX + 1];
 
void DFS(int node, int p) {
    stamp++;
    timp[node].first = ++timestamp;
    lista[region[node]].push_back({node, stamp});
    if(bigIdx[region[node]] != 0) {
        countAbove[bigIdx[region[node]]]++;
    }
    for(int i = 1; i <= R; i++) {
        sol[i][region[node]] += 1LL * countAbove[i];
    }
    for(auto x : v[node]) {
        if(x == p)
            continue;
        DFS(x, node);
    }
    if(bigIdx[region[node]] != 0) {
        countAbove[bigIdx[region[node]]]--;
    }
    stamp++;
    timp[node].second = timestamp;
    lista[region[node]].push_back({node, stamp});
}
 
int main() {
    int i;
    cin >> n >> R >> Q;
    cin >> region[1];
    vertices[region[1]].push_back(1);
    cati[region[1]]++;
    for(i = 2; i <= n; i++) {
        int p;
        cin >> p >> region[i];
        v[p].push_back(i);
        v[i].push_back(p);
        vertices[region[i]].push_back(i);
        cati[region[i]]++;
    }
    int cc = 0, sc = 0;
    for(i = 1; i <= R; i++) {
        if(cati[i] >= BLOCK) {
            bigR[++cc] = i;
            bigIdx[i] = cc;
        } else {
            smallR[++sc] = i;
            smallIdx[i] = sc;
        }
    }
    DFS(1, 0);
    for(int i = 1; i <= R; i++) {
        if(bigIdx[i] == 0) continue;
        for(auto x : vertices[i]) {
            preorder[timp[x].first]++; /// BRUH
            preorder[timp[x].second + 1]--;
        }
        for(int j = 1; j <= n; j++) {
            preorder[j] += preorder[j - 1];
        }
        for(int j = 1; j <= sc; j++) {
            for(auto x : vertices[smallR[j]])
                precalc[j][bigIdx[i]] += 1LL * (preorder[timp[x].second] - preorder[timp[x].first - 1]);
        }
        for(int j = 1; j <= n; j++)
            preorder[j] = 0;
    }
    while(Q--) {
        int a, b;
        cin >> a >> b;
        if(bigIdx[a] != 0) { /// Aia de sus mare
            cout << sol[bigIdx[a]][b] << "\n";
        } else if(bigIdx[b] != 0) { /// Aia de jos mare si aia de sus mica
            cout << precalc[smallIdx[a]][bigIdx[b]] << "\n";
        } else { /// Ambele mici
            int i = 0;
            int j = 0;
            int deschise = 0;
            vf = 0;
            int rez = 0;
            while(i < lista[a].size() && j < lista[b].size()) {
                pii x = lista[a][i];
                pii y = lista[b][j];
                if(x.second < y.second) {
                    if(stiva[vf] == x.first) {
                        vf--;
                        deschise--;
                    } else {
                        stiva[++vf] = x.first;
                        deschise++;
                    }
                    i++;
                } else {
                    if(stiva[vf] == y.first) {
                        vf--;
                    } else {
                        rez += deschise;
                        stiva[++vf] = y.first;
                    }
                    j++;
                }
            }
            cout << rez;
        }
        cout << endl;
    }
    return 0;
}

Compilation message

regions.cpp:12:22: warning: overflow in conversion from 'long long int' to 'int' changes value from '1152921504606846976' to '0' [-Woverflow]
   12 | const int INF = (1LL << 60);
      |                 ~~~~~^~~~~~
regions.cpp: In function 'int main()':
regions.cpp:115:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |             while(i < lista[a].size() && j < lista[b].size()) {
      |                   ~~^~~~~~~~~~~~~~~~~
regions.cpp:115:44: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |             while(i < lista[a].size() && j < lista[b].size()) {
      |                                          ~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 28424 KB Output is correct
2 Correct 19 ms 28536 KB Output is correct
3 Correct 17 ms 28488 KB Output is correct
4 Correct 19 ms 28616 KB Output is correct
5 Correct 22 ms 28616 KB Output is correct
6 Correct 35 ms 29140 KB Output is correct
7 Correct 43 ms 28872 KB Output is correct
8 Correct 48 ms 29052 KB Output is correct
9 Correct 76 ms 29896 KB Output is correct
10 Correct 109 ms 30024 KB Output is correct
11 Correct 146 ms 30152 KB Output is correct
12 Correct 160 ms 31168 KB Output is correct
13 Correct 184 ms 31108 KB Output is correct
14 Correct 227 ms 31296 KB Output is correct
15 Correct 240 ms 35224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1041 ms 35936 KB Output isn't correct
2 Incorrect 1276 ms 35556 KB Output isn't correct
3 Incorrect 1847 ms 38748 KB Output isn't correct
4 Correct 944 ms 32060 KB Output is correct
5 Correct 1519 ms 34368 KB Output is correct
6 Runtime error 2393 ms 70724 KB Execution killed with signal 11
7 Runtime error 5687 ms 73908 KB Execution killed with signal 11
8 Execution timed out 8099 ms 42268 KB Time limit exceeded
9 Runtime error 164 ms 73140 KB Execution killed with signal 11
10 Runtime error 156 ms 75312 KB Execution killed with signal 11
11 Runtime error 211 ms 78416 KB Execution killed with signal 11
12 Runtime error 214 ms 75900 KB Execution killed with signal 11
13 Runtime error 172 ms 75956 KB Execution killed with signal 11
14 Runtime error 179 ms 77188 KB Execution killed with signal 11
15 Runtime error 177 ms 77500 KB Execution killed with signal 11
16 Runtime error 191 ms 77228 KB Execution killed with signal 11
17 Runtime error 183 ms 77200 KB Execution killed with signal 11