Submission #794570

#TimeUsernameProblemLanguageResultExecution timeMemory
794570CookieRegions (IOI09_regions)C++14
0 / 100
150 ms90120 KiB
#include<bits/stdc++.h> #include<fstream> using namespace std; #define ll long long #define pb push_back #define forr(i, a, b) for(int i = a; i < b; i++) #define dorr(i, a, b) for(int i = a; i >= b; i--) #define ld long double #define vt vector #include<fstream> #define fi first #define se second #define pll pair<ll, ll> #define pii pair<int, int> const ld PI = 3.14159265359; const ll mod = 1e9 + 7; const int mxn = 2e5 + 5, mxm = 1e5, sq = 400; const ld inf = 1e9; int n, r, q, root; int colour[mxn + 1], tin[mxn + 1], tout[mxn + 1], tt = 0, cnt[mxn + 1]; vt<int>vec[mxn + 1], adj[mxn + 1], to[mxn + 1]; vt<ll>ansb[mxn + 1]; void dfs(int s, int pre){ tin[s] = ++tt; for(auto i: adj[s]){ if(i != pre){ dfs(i, s); } } tout[s] = tt; } struct th{ int id, pos, type; bool operator <(const th &b){ if(pos != b.pos)return(pos < b.pos); if(type != b.type)return(type < b.type); if(id != b.id)return(id > b.id); } }; void solvebig(int i){ vt<th>comp; for(auto k: vec[i]){ comp.pb({0, tin[k], -1}); comp.pb({0, tout[k],1}); } for(int j = 1; j <= r; j++){ if(j != i){ for(auto k: vec[j]){ comp.pb({k, tin[k], -1}); comp.pb({k, tout[k], 1}); } } } sort(comp.begin(), comp.end()); ll cnt =0 ; for(auto [id, pos, type]: comp){ if(id == 0){ if(type == 1)cnt++; else cnt--; }else{ if(type == 1)ansb[i][id] -= cnt; else ansb[i][id] += cnt; } } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> r >> q; cin >> colour[1]; vec[colour[1]].pb(1); for(int i = 2; i <= n; i++){ int p; cin >> p >> colour[i]; cnt[colour[i]]++; vec[colour[i]].pb(i); adj[p].pb(i); } dfs(1, -1); for(int i = 1; i <= r; i++){ for(auto j: vec[i]){ to[i].pb(tin[j]); } sort(to[i].begin(), to[i].end()); } for(int i = 1; i <= r; i++){ if(cnt[i] >= sq){ ansb[i].resize(r + 1); solvebig(i); } } while(q--){ int r1, r2; cin >> r1 >> r2; if(cnt[r1] >= sq){ cout << ansb[r1][r2] << "\n"; }else{ ll ans = 0; for(auto i: vec[r1]){ int idl = lower_bound(to[r2].begin(), to[r2].end(), tin[i]) - to[r2].begin(); int idr = upper_bound(to[r2].begin(), to[r2].end(), tout[i]) - to[r2].begin() - 1; ans += 1LL * (idr - idl + 1); } cout << ans << "\n"; } } return(0); }

Compilation message (stderr)

regions.cpp: In function 'void solvebig(int)':
regions.cpp:57:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   57 |     for(auto [id, pos, type]: comp){
      |              ^
regions.cpp: In member function 'bool th::operator<(const th&)':
regions.cpp:39:5: warning: control reaches end of non-void function [-Wreturn-type]
   39 |     }
      |     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...