Submission #523473

# Submission time Handle Problem Language Result Execution time Memory
523473 2022-02-07T17:21:26 Z Vladth11 Regions (IOI09_regions) C++14
0 / 100
8000 ms 45132 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 = 0;
const int base = 31;
const int nr_of_bits = 21;
const int MMAX = NMAX / 1 + 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()) {
      |                                          ~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 8 ms 14408 KB Output isn't correct
2 Incorrect 9 ms 14408 KB Output isn't correct
3 Incorrect 9 ms 14408 KB Output isn't correct
4 Incorrect 11 ms 14408 KB Output isn't correct
5 Incorrect 14 ms 14408 KB Output isn't correct
6 Incorrect 30 ms 14536 KB Output isn't correct
7 Incorrect 39 ms 14536 KB Output isn't correct
8 Incorrect 37 ms 14636 KB Output isn't correct
9 Incorrect 67 ms 15256 KB Output isn't correct
10 Incorrect 86 ms 15164 KB Output isn't correct
11 Incorrect 69 ms 15680 KB Output isn't correct
12 Incorrect 167 ms 16376 KB Output isn't correct
13 Incorrect 176 ms 16476 KB Output isn't correct
14 Incorrect 164 ms 16908 KB Output isn't correct
15 Incorrect 191 ms 20776 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Incorrect 655 ms 21096 KB Output isn't correct
2 Incorrect 995 ms 20620 KB Output isn't correct
3 Incorrect 1142 ms 23652 KB Output isn't correct
4 Incorrect 510 ms 17340 KB Output isn't correct
5 Incorrect 943 ms 19392 KB Output isn't correct
6 Incorrect 1503 ms 19096 KB Output isn't correct
7 Incorrect 2923 ms 20820 KB Output isn't correct
8 Incorrect 3928 ms 27760 KB Output isn't correct
9 Incorrect 7945 ms 29048 KB Output isn't correct
10 Execution timed out 8061 ms 35856 KB Time limit exceeded
11 Execution timed out 8055 ms 31904 KB Time limit exceeded
12 Execution timed out 8066 ms 29504 KB Time limit exceeded
13 Execution timed out 8058 ms 30664 KB Time limit exceeded
14 Execution timed out 8051 ms 31124 KB Time limit exceeded
15 Execution timed out 8039 ms 36196 KB Time limit exceeded
16 Execution timed out 8018 ms 45132 KB Time limit exceeded
17 Execution timed out 8018 ms 43648 KB Time limit exceeded