답안 #523530

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523530 2022-02-07T18:07:37 Z Vladth11 Regions (IOI09_regions) C++14
30 / 100
1415 ms 51568 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 = 200001;
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 = NMAX / BLOCK + 2;

vector <int> v[NMAX], vertices[NMAX];
vector <pii> lista[NMAX];
int stamp;
int n, R, Q;
ll sol[MMAX][25001];
ll precalc[25001][MMAX];
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
        }
        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(vf && stiva[vf] == x.first) {
                        vf--;
                        deschise--;
                    } else {
                        stiva[++vf] = x.first;
                        deschise++;
                    }
                    i++;
                } else {
                    if(vf && 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:114: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]
  114 |             while(i < lista[a].size() && j < lista[b].size()) {
      |                   ~~^~~~~~~~~~~~~~~~~
regions.cpp:114: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]
  114 |             while(i < lista[a].size() && j < lista[b].size()) {
      |                                          ~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14408 KB Output is correct
2 Correct 8 ms 14400 KB Output is correct
3 Correct 9 ms 14408 KB Output is correct
4 Correct 12 ms 14536 KB Output is correct
5 Correct 11 ms 14664 KB Output is correct
6 Correct 20 ms 16072 KB Output is correct
7 Correct 34 ms 15304 KB Output is correct
8 Correct 41 ms 15688 KB Output is correct
9 Correct 51 ms 17224 KB Output is correct
10 Correct 104 ms 18312 KB Output is correct
11 Correct 135 ms 17272 KB Output is correct
12 Correct 162 ms 19812 KB Output is correct
13 Correct 191 ms 18752 KB Output is correct
14 Correct 184 ms 18008 KB Output is correct
15 Correct 272 ms 22144 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 864 ms 22916 KB Output is correct
2 Correct 1065 ms 22680 KB Output is correct
3 Correct 1415 ms 26204 KB Output is correct
4 Runtime error 46 ms 35788 KB Execution killed with signal 11
5 Runtime error 54 ms 36216 KB Execution killed with signal 11
6 Runtime error 70 ms 37656 KB Execution killed with signal 11
7 Runtime error 73 ms 39408 KB Execution killed with signal 11
8 Runtime error 90 ms 41984 KB Execution killed with signal 11
9 Runtime error 124 ms 46568 KB Execution killed with signal 11
10 Runtime error 156 ms 48876 KB Execution killed with signal 11
11 Runtime error 163 ms 51568 KB Execution killed with signal 11
12 Runtime error 150 ms 49532 KB Execution killed with signal 11
13 Runtime error 159 ms 49520 KB Execution killed with signal 11
14 Runtime error 173 ms 50716 KB Execution killed with signal 11
15 Runtime error 161 ms 51068 KB Execution killed with signal 11
16 Runtime error 162 ms 50824 KB Execution killed with signal 11
17 Runtime error 168 ms 50660 KB Execution killed with signal 11