Submission #523549

# Submission time Handle Problem Language Result Execution time Memory
523549 2022-02-07T18:24:06 Z Vladth11 Regions (IOI09_regions) C++14
65 / 100
3779 ms 131076 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 <ll, ll> pii;
typedef pair <long double, pii> muchie;
 
const ll NMAX = 200001;
const ll VMAX = 21;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 447;
const ll base = 31;
const ll nr_of_bits = 21;
const ll MMAX = NMAX / BLOCK + 2;
 
vector <ll> v[NMAX], vertices[NMAX];
vector <pii> lista[NMAX];
ll stamp;
ll n, R, Q;
ll sol[MMAX][25001];
ll precalc[25001][MMAX];
ll region[NMAX];
ll bigR[NMAX];
ll smallR[NMAX];
ll bigIdx[NMAX];
ll smallIdx[NMAX];
ll cati[NMAX];
ll stiva[NMAX];
ll vf;
ll countAbove[MMAX];
ll timestamp;
pii timp[NMAX];
ll preorder[NMAX + 1];
 
void DFS(ll node, ll p) {
    stamp++;
    timp[node].first = ++timestamp;
    lista[region[node]].push_back({node, stamp});
    if(bigIdx[region[node]] != 0) {
        countAbove[bigIdx[region[node]]]++;
    }
    for(ll i = 1; i < MMAX; 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() {
    ll i;
    cin >> n >> R >> Q;
    cin >> region[1];
    vertices[region[1]].push_back(1);
    cati[region[1]]++;
    for(i = 2; i <= n; i++) {
        ll p;
        cin >> p >> region[i];
        v[p].push_back(i);
        v[i].push_back(p);
        vertices[region[i]].push_back(i);
        cati[region[i]]++;
    }
    ll 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(ll i = 1; i <= R; i++) {
        if(bigIdx[i] == 0) continue;
        for(auto x : vertices[i]) {
            preorder[timp[x].first]++; /// BRUH
        }
        for(ll j = 1; j <= n; j++) {
            preorder[j] += preorder[j - 1];
        }
        for(ll 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(ll j = 1; j <= n; j++)
            preorder[j] = 0;
    }
    while(Q--) {
        ll a, b;
        cin >> a >> b;
        if(bigIdx[a] != 0) { /// Aia de sus mare
            cout << sol[bigIdx[a]][b];
        } else if(bigIdx[b] != 0) { /// Aia de jos mare si aia de sus mica
            cout << precalc[smallIdx[a]][bigIdx[b]];
        } else { /// Ambele mici
            ll i = 0;
            ll j = 0;
            ll deschise = 0;
            vf = 0;
            ll 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: In function 'int main()':
regions.cpp:114:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long 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: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |             while(i < lista[a].size() && j < lista[b].size()) {
      |                                          ~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 9 ms 16328 KB Output is correct
2 Correct 8 ms 16328 KB Output is correct
3 Correct 14 ms 16456 KB Output is correct
4 Correct 17 ms 16456 KB Output is correct
5 Correct 23 ms 16532 KB Output is correct
6 Correct 38 ms 17352 KB Output is correct
7 Correct 48 ms 17096 KB Output is correct
8 Correct 47 ms 17344 KB Output is correct
9 Correct 37 ms 18504 KB Output is correct
10 Correct 106 ms 19080 KB Output is correct
11 Correct 139 ms 19036 KB Output is correct
12 Correct 132 ms 20704 KB Output is correct
13 Correct 133 ms 20760 KB Output is correct
14 Correct 226 ms 20948 KB Output is correct
15 Correct 322 ms 25868 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 950 ms 27712 KB Output is correct
2 Correct 1190 ms 27596 KB Output is correct
3 Correct 1779 ms 31424 KB Output is correct
4 Correct 382 ms 34416 KB Output is correct
5 Correct 430 ms 40484 KB Output is correct
6 Correct 610 ms 69692 KB Output is correct
7 Correct 1454 ms 95768 KB Output is correct
8 Correct 1118 ms 104292 KB Output is correct
9 Correct 2674 ms 89356 KB Output is correct
10 Runtime error 968 ms 131076 KB Execution killed with signal 9
11 Correct 3779 ms 126412 KB Output is correct
12 Runtime error 1086 ms 131076 KB Execution killed with signal 9
13 Runtime error 1112 ms 131076 KB Execution killed with signal 9
14 Runtime error 1165 ms 131076 KB Execution killed with signal 9
15 Runtime error 1159 ms 131076 KB Execution killed with signal 9
16 Runtime error 916 ms 131076 KB Execution killed with signal 9
17 Runtime error 1199 ms 131076 KB Execution killed with signal 9