제출 #607124

#제출 시각아이디문제언어결과실행 시간메모리
607124jhwest2Regions (IOI09_regions)C++14
0 / 100
8057 ms71668 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]; 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; tree[idx] = tree[ll] + tree[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() { 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]]); } for (int i = 1; i <= r; i++) { sort(V[i].begin(), V[i].end()); } dfs(1); 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 += lower_bound(V[b].begin(), V[b].end(), RR[x]) - lower_bound(V[b].begin(), V[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:49:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   49 |         int mid = (lo + hi >> 1);
      |                    ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...