답안 #523504

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523504 2022-02-07T17:51:34 Z Vladth11 Regions (IOI09_regions) C++14
5 / 100
218 ms 47624 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 = 10000000;
const int base = 31;
const int nr_of_bits = 21;
const int MMAX = NMAX / BLOCK + 5;

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
            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 8 ms 14408 KB Output is correct
2 Correct 8 ms 14408 KB Output is correct
3 Correct 10 ms 14408 KB Output is correct
4 Correct 11 ms 14408 KB Output is correct
5 Correct 15 ms 14408 KB Output is correct
6 Runtime error 20 ms 29060 KB Execution killed with signal 11
7 Runtime error 27 ms 29128 KB Execution killed with signal 11
8 Runtime error 21 ms 29192 KB Execution killed with signal 11
9 Runtime error 22 ms 29484 KB Execution killed with signal 11
10 Runtime error 27 ms 29888 KB Execution killed with signal 11
11 Runtime error 28 ms 30412 KB Execution killed with signal 11
12 Runtime error 31 ms 30812 KB Execution killed with signal 11
13 Runtime error 36 ms 31092 KB Execution killed with signal 11
14 Runtime error 38 ms 31576 KB Execution killed with signal 11
15 Runtime error 44 ms 32352 KB Execution killed with signal 11
# 결과 실행 시간 메모리 Grader output
1 Runtime error 67 ms 35216 KB Execution killed with signal 11
2 Runtime error 93 ms 35844 KB Execution killed with signal 11
3 Runtime error 92 ms 36360 KB Execution killed with signal 11
4 Runtime error 43 ms 31780 KB Execution killed with signal 11
5 Runtime error 42 ms 32320 KB Execution killed with signal 11
6 Runtime error 68 ms 33588 KB Execution killed with signal 11
7 Runtime error 73 ms 35364 KB Execution killed with signal 11
8 Runtime error 101 ms 37952 KB Execution killed with signal 11
9 Runtime error 141 ms 42652 KB Execution killed with signal 11
10 Runtime error 152 ms 44752 KB Execution killed with signal 11
11 Runtime error 204 ms 47624 KB Execution killed with signal 11
12 Runtime error 149 ms 45368 KB Execution killed with signal 11
13 Runtime error 165 ms 45452 KB Execution killed with signal 11
14 Runtime error 195 ms 46736 KB Execution killed with signal 11
15 Runtime error 165 ms 47048 KB Execution killed with signal 11
16 Runtime error 158 ms 46884 KB Execution killed with signal 11
17 Runtime error 218 ms 46596 KB Execution killed with signal 11