Submission #523543

# Submission time Handle Problem Language Result Execution time Memory
523543 2022-02-07T18:15:47 Z Vladth11 Regions (IOI09_regions) C++14
30 / 100
1922 ms 73812 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 = 300001;
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 = 700;

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 <= 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() {
    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] << "\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
            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 14 ms 21448 KB Output is correct
2 Correct 11 ms 21480 KB Output is correct
3 Correct 13 ms 21576 KB Output is correct
4 Correct 17 ms 21576 KB Output is correct
5 Correct 21 ms 21704 KB Output is correct
6 Correct 33 ms 23240 KB Output is correct
7 Correct 42 ms 22508 KB Output is correct
8 Correct 52 ms 22948 KB Output is correct
9 Correct 62 ms 24520 KB Output is correct
10 Correct 98 ms 25792 KB Output is correct
11 Correct 125 ms 24904 KB Output is correct
12 Correct 159 ms 27760 KB Output is correct
13 Correct 184 ms 27068 KB Output is correct
14 Correct 248 ms 26584 KB Output is correct
15 Correct 335 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 879 ms 33424 KB Output is correct
2 Correct 1225 ms 33392 KB Output is correct
3 Correct 1922 ms 37356 KB Output is correct
4 Runtime error 78 ms 53112 KB Execution killed with signal 11
5 Runtime error 67 ms 53540 KB Execution killed with signal 11
6 Runtime error 78 ms 55592 KB Execution killed with signal 11
7 Runtime error 102 ms 57744 KB Execution killed with signal 11
8 Runtime error 112 ms 60452 KB Execution killed with signal 11
9 Runtime error 155 ms 66704 KB Execution killed with signal 11
10 Runtime error 187 ms 68936 KB Execution killed with signal 11
11 Runtime error 183 ms 73812 KB Execution killed with signal 11
12 Runtime error 226 ms 69700 KB Execution killed with signal 11
13 Runtime error 179 ms 70112 KB Execution killed with signal 11
14 Runtime error 179 ms 72260 KB Execution killed with signal 11
15 Runtime error 221 ms 71400 KB Execution killed with signal 11
16 Runtime error 229 ms 70856 KB Execution killed with signal 11
17 Runtime error 180 ms 71252 KB Execution killed with signal 11