Submission #862006

#TimeUsernameProblemLanguageResultExecution timeMemory
862006lozergamRegions (IOI09_regions)C++17
0 / 100
81 ms131072 KiB
#include <bits/stdc++.h> #include <numeric> using namespace std; #define ll long long #define pb push_back ll min(ll a , ll b) { if(a < b)return a; return b; } ll max(ll a , ll b) { if(a > b)return a; return b; } const ll maxn = 200052, max_SQRT = 125; // la la lay lay ll N, R, Q, H[maxn], rgnOrd[maxn >> 3], revOrd[maxn >> 3]; vector<ll> adj[maxn], rgnLst[maxn >> 3], rgnLst2[maxn >> 3]; ll timer, tin[maxn], tout[maxn]; ll tdall[max_SQRT][max_SQRT], td[maxn][max_SQRT]; void dfs(ll f) { tin[f] = timer++; for (ll i = 0; i < min(R, max_SQRT) && revOrd[H[f]] < max_SQRT; i++) { tdall[revOrd[H[f]]][i] += td[f][i]; } for (ll nf : adj[f]) { for (ll i = 0; i < min(R, max_SQRT); i++) { td[nf][i] = td[f][i] + (rgnOrd[i] == H[f]); } dfs(nf); } tout[f] = timer - 1; } signed main() { scanf("%lli%lli%lli%lli", &N, &R, &Q, &H[0]); rgnLst[--H[0]].push_back(0); for (ll i = 1, p; i < N; i++) { scanf("%d%d", &p, &H[i]); adj[--p].push_back(i); rgnLst[--H[i]].push_back(i); } iota(rgnOrd, rgnOrd + R, 0); sort(rgnOrd, rgnOrd + R, [&](const ll &a, const ll &b) { return rgnLst[a].size() > rgnLst[b].size(); }); for (ll i = 0; i < R; i++) { revOrd[rgnOrd[i]] = i; } dfs(0); for (ll i = 0; i < R; i++) { for (ll j : rgnLst[i]) { rgnLst2[i].push_back(tin[j]); } sort(rgnLst2[i].begin(), rgnLst2[i].end()); } for (ll a, b, ans; Q--;) { scanf("%lli%lli", &a, &b); a--, b--; ans = 0; if (revOrd[a] < max_SQRT && revOrd[b] < max_SQRT) { ans = tdall[revOrd[b]][revOrd[a]]; } else if (revOrd[a] < max_SQRT) { for (ll i : rgnLst[b]) { ans += td[i][revOrd[a]]; } } else { for (ll i : rgnLst[a]) { ans += upper_bound(rgnLst2[b].begin(), rgnLst2[b].end(), tout[i]) - lower_bound(rgnLst2[b].begin(), rgnLst2[b].end(), tin[i]); } } printf("%lli\n", ans); } } /* ZZZZZZZ A M M IIIIIII N N TTTTTTTTTT RRRRRR EEEEEEE EEEEEEE Z A A M M M M I NN N TT R R E E Z A A M M M M I N N N TT R R E E Z AAAAAAA M M M I N N N TT RRRRRR EEEEEEE EEEEEEE Z A A M M I N N N TT RR E E Z A A M M I N NN TT R R E E ZZZZZZZ A A M M IIIIIII N N TT R R EEEEEEE EEEEEEE */

Compilation message (stderr)

regions.cpp: In function 'int main()':
regions.cpp:49:17: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat=]
   49 |         scanf("%d%d", &p, &H[i]);
      |                ~^     ~~
      |                 |     |
      |                 int*  long long int*
      |                %lld
regions.cpp:49:19: warning: format '%d' expects argument of type 'int*', but argument 3 has type 'long long int*' [-Wformat=]
   49 |         scanf("%d%d", &p, &H[i]);
      |                  ~^       ~~~~~
      |                   |       |
      |                   int*    long long int*
      |                  %lld
regions.cpp:45:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |     scanf("%lli%lli%lli%lli", &N, &R, &Q, &H[0]);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:49:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |         scanf("%d%d", &p, &H[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
regions.cpp:73:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |         scanf("%lli%lli", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...