답안 #523471

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523471 2022-02-07T17:19:44 Z Vladth11 Regions (IOI09_regions) C++14
0 / 100
8000 ms 58816 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 = 1;
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][3];
ll precalc[3][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] = 1;
            preorder[timp[x].second + 1] = -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 Incorrect 7 ms 14408 KB Output isn't correct
2 Incorrect 8 ms 14408 KB Output isn't correct
3 Incorrect 11 ms 14408 KB Output isn't correct
4 Incorrect 13 ms 14408 KB Output isn't correct
5 Incorrect 15 ms 14404 KB Output isn't correct
6 Incorrect 31 ms 14664 KB Output isn't correct
7 Incorrect 44 ms 14536 KB Output isn't correct
8 Incorrect 35 ms 14536 KB Output isn't correct
9 Incorrect 57 ms 15176 KB Output isn't correct
10 Incorrect 139 ms 15176 KB Output isn't correct
11 Incorrect 125 ms 15560 KB Output isn't correct
12 Incorrect 156 ms 16328 KB Output isn't correct
13 Incorrect 163 ms 16392 KB Output isn't correct
14 Incorrect 184 ms 16972 KB Output isn't correct
15 Incorrect 230 ms 20768 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 795 ms 21176 KB Output isn't correct
2 Incorrect 876 ms 20620 KB Output isn't correct
3 Incorrect 1371 ms 23652 KB Output isn't correct
4 Runtime error 396 ms 34820 KB Execution killed with signal 11
5 Runtime error 445 ms 39360 KB Execution killed with signal 11
6 Runtime error 1088 ms 38644 KB Execution killed with signal 11
7 Incorrect 2916 ms 20928 KB Output isn't correct
8 Incorrect 3980 ms 27764 KB Output isn't correct
9 Runtime error 6567 ms 58816 KB Execution killed with signal 11
10 Execution timed out 8036 ms 35784 KB Time limit exceeded
11 Execution timed out 8071 ms 32028 KB Time limit exceeded
12 Execution timed out 8071 ms 29760 KB Time limit exceeded
13 Execution timed out 8042 ms 30728 KB Time limit exceeded
14 Execution timed out 8042 ms 31536 KB Time limit exceeded
15 Execution timed out 8021 ms 36344 KB Time limit exceeded
16 Execution timed out 8039 ms 45096 KB Time limit exceeded
17 Execution timed out 8039 ms 43740 KB Time limit exceeded