제출 #1137770

#제출 시각아이디문제언어결과실행 시간메모리
1137770sanoRegions (IOI09_regions)C++17
0 / 100
343 ms29240 KiB
#include<iostream> #include<vector> #include<queue> #include<deque> #include<string> #include<fstream> #include<algorithm> #include <iomanip> #include<map> #include <set> #include <unordered_map> #include <stack> #include <unordered_set> #include <cmath> #include <cstdint> #define shit short int #define ll long long #define For(i, n) for(int i = 0; i < (int)n; i++) #define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++) #define rfor(i, n) for(int i = (int)n; i >= (int)0; i--) #define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--) #define vec vector #define ff first #define ss second #define pb push_back #define pii pair<int, int> #define NEK 1000000000 #define mod 1000000007 #define mod2 1000000009 #define rsz resize #define prv1 43 #define prv2 47 #define D 8 #define trav(a,x) for (auto& a: x) #define pb push_back #define ub upper_bound #define lb lower_bound #define sig 0.0000001 using namespace std; vec<vec<int>> g; vec<vec<int>> mp; vec<int> k; void dfs(int x, int f, int poc = 0, int pr = -1) { if (k[x] == f) poc++; else { mp.back()[k[x]] += poc; } trav(i, g[x]) { if (i == pr) continue; dfs(i, f, poc, x); } return; } vec<int> e1, e2; int ti = 0; void dfs2(int x, int pr = -1) { e1[x] = ti; ti++; trav(i, g[x]) { if (i == pr) continue; dfs2(i, x); } e2[x] = ti - 1; return; } void solve() { int n, r, q; cin >> n >> r >> q; k.resize(n); e1.resize(n); e2.resize(n); g.resize(n); cin >> k[0]; k[0]--; For(i, (n - 1)) { int a; cin >> a >> k[i + 1]; k[i + 1]--; a--; g[i+1].push_back(a); g[a].push_back(i+1); } vec<int> p(r, 0); vec<int> prazdny(r, 0); For(i, k.size()) p[k[i]]++; int odm = sqrt(n); vec<int> v(r, -1); For(i, p.size()) { if (p[i] > odm) { v[i] = mp.size(); mp.push_back(prazdny); dfs(0, i); } } vec<vec<int>> vy(r); dfs2(0); For(i, n) { vy[k[i]].push_back(e1[i]); } For(i, vy.size()) sort(vy[i].begin(), vy[i].end()); For(i, q) { int r1, r2; cin >> r1 >> r2; r1--; r2--; if (v[r1] == -1) { int vv = 0; trav(j, vy[r1]) { int q1 = lower_bound(vy[r2].begin(), vy[r2].end(), e1[j]) - vy[r2].begin(); int q2 = upper_bound(vy[r2].begin(), vy[r2].end(), e2[j]) - vy[r2].begin(); vv += q2 - q1; } cout << vv << '\n'; } else { cout << mp[v[r1]][r2] << '\n'; } } return; } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; //cin >> t; t = 1; while (t--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...