답안 #523542

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523542 2022-02-07T18:14:15 Z Vladth11 Regions (IOI09_regions) C++14
30 / 100
1677 ms 59000 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 = 630;

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()) {
      |                                          ~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14408 KB Output is correct
2 Correct 8 ms 14480 KB Output is correct
3 Correct 9 ms 14536 KB Output is correct
4 Correct 12 ms 14592 KB Output is correct
5 Correct 13 ms 14664 KB Output is correct
6 Correct 29 ms 16072 KB Output is correct
7 Correct 22 ms 15432 KB Output is correct
8 Correct 42 ms 15816 KB Output is correct
9 Correct 68 ms 17548 KB Output is correct
10 Correct 93 ms 18808 KB Output is correct
11 Correct 132 ms 17864 KB Output is correct
12 Correct 146 ms 20672 KB Output is correct
13 Correct 197 ms 20004 KB Output is correct
14 Correct 228 ms 19436 KB Output is correct
15 Correct 289 ms 24568 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1014 ms 26352 KB Output is correct
2 Correct 1086 ms 26352 KB Output is correct
3 Correct 1677 ms 30512 KB Output is correct
4 Runtime error 51 ms 38224 KB Execution killed with signal 11
5 Runtime error 55 ms 38604 KB Execution killed with signal 11
6 Runtime error 65 ms 40552 KB Execution killed with signal 11
7 Runtime error 86 ms 42816 KB Execution killed with signal 11
8 Runtime error 97 ms 45556 KB Execution killed with signal 11
9 Runtime error 153 ms 51780 KB Execution killed with signal 11
10 Runtime error 148 ms 53952 KB Execution killed with signal 11
11 Runtime error 170 ms 59000 KB Execution killed with signal 11
12 Runtime error 164 ms 54860 KB Execution killed with signal 11
13 Runtime error 155 ms 55208 KB Execution killed with signal 11
14 Runtime error 174 ms 57272 KB Execution killed with signal 11
15 Runtime error 173 ms 56468 KB Execution killed with signal 11
16 Runtime error 167 ms 55872 KB Execution killed with signal 11
17 Runtime error 166 ms 56324 KB Execution killed with signal 11