제출 #607149

#제출 시각아이디문제언어결과실행 시간메모리
607149jhwest2Regions (IOI09_regions)C++14
0 / 100
8048 ms73840 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 202020;
const int MAXR = 25252;
typedef long long ll;

int n, r, q, R[MAXN], P[MAXN], X[MAXN];
vector<int> G[MAXN];
vector<int> V[MAXR], W[MAXR];
map<pair<int, int>, ll> M;


struct PST {
    vector<int> tree, l, r;

    int new_node() {
        tree.push_back(0);
        l.push_back(0);
        r.push_back(0);
        return (int)tree.size() - 1;
    }
    int init(int lo, int hi) {
        int idx = new_node();
        if (lo != hi) {
            int ll = init(lo, lo + hi >> 1);
            int rr = init(1 + (lo + hi >> 1), hi);
            l[idx] = ll;
            r[idx] = rr;
        }
        return idx;
    }
    int update(int s, int x, int lo, int hi, int p_idx) {
        int idx = new_node();
        if (lo == hi) {
            tree[idx] += x; return idx;
        }
        int mid = (lo + hi >> 1);
        int ll = (s <= mid) ? update(s, x, lo, mid, l[p_idx]) : l[p_idx];
        int rr = (s > mid) ? update(s, x, mid + 1, hi, r[p_idx]) : r[p_idx];
        l[idx] = ll;
        r[idx] = rr;
        return idx;
    }
    int get() { return tree.size(); }
    int query(int s, int lo, int hi, int idx) {
        if (lo == hi) return tree[idx];
        int mid = (lo + hi >> 1);
        if (s <= mid) return query(s, lo, mid, l[idx]);
        else return query(s, mid + 1, hi, r[idx]);
    }
} PST;

int p, LL[MAXN], RR[MAXN];
void dfs(int v) {
    LL[v] = ++p;
    for (int x : G[v]) dfs(x);
    RR[v] = p;
}
int main() {
    cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> r >> q;
    cin >> R[1]; V[R[1]].push_back(1);
    for (int i = 2; i <= n; i++) {
        cin >> P[i] >> R[i];
        G[P[i]].push_back(i);
        V[R[i]].push_back(i);
    }

    PST.init(1, r);
    for (int i = 1; i <= n; i++) {
        X[i] = PST.get();
        PST.update(R[i], 1, 1, r, X[P[i]]);
    }

    dfs(1);
    for (int i = 1; i <= n; i++) {
        W[R[i]].push_back(LL[i]);
    }
    for (int i = 1; i <= r; i++) {
        sort(W[i].begin(), W[i].end());
    }
    while (q--) {
        int a, b; cin >> a >> b;
        if (M.find({ a, b }) != M.end()) {
            cout << M[{a, b}] << endl;
            continue;
        }
        ll ans = 0;
        if (V[a].size() <= V[b].size()) {
            for (int x : V[a]) {
                ans += upper_bound(W[b].begin(), W[b].end(), RR[x]) -
                    lower_bound(W[b].begin(), W[b].end(), LL[x]);
            }
        }
        else {
            for (int x : V[b]) {
                ans += PST.query(a, 1, r, X[x]);
            }
        }
        M[{a, b}] = ans;
        cout << ans << endl;
    }
}

컴파일 시 표준 에러 (stderr) 메시지

regions.cpp: In member function 'int PST::init(int, int)':
regions.cpp:26:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   26 |             int ll = init(lo, lo + hi >> 1);
      |                               ~~~^~~~
regions.cpp:27:35: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |             int rr = init(1 + (lo + hi >> 1), hi);
      |                                ~~~^~~~
regions.cpp: In member function 'int PST::update(int, int, int, int, int)':
regions.cpp:38:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   38 |         int mid = (lo + hi >> 1);
      |                    ~~~^~~~
regions.cpp: In member function 'int PST::query(int, int, int, int)':
regions.cpp:48:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   48 |         int mid = (lo + hi >> 1);
      |                    ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...