Submission #74287

#TimeUsernameProblemLanguageResultExecution timeMemory
74287BruteforcemanRegions (IOI09_regions)C++11
70 / 100
8015 ms80560 KiB
#include "bits/stdc++.h" using namespace std; int N, R, Q; int a[200010], p[200010]; const int magic = 106; int ans[1880][25001]; vector <int> g[200010]; int idx[25001]; int current; int tot[25001]; void dfs(int x, int cnt) { cnt += (current == a[x]); if(a[x] != current) { ans[idx[current]][a[x]] += cnt; } for(auto i : g[x]) { dfs(i, cnt); } } int in[200010]; int out[200010]; vector <int> v[25001]; vector <int> nodes[25001]; int cur; void go(int x) { in[x] = ++cur; v[a[x]].emplace_back(in[x]); for(auto i : g[x]) { go(i); } out[x] = cur; } int count(int l, int r, int val) { return upper_bound(v[val].begin(), v[val].end(), r) - lower_bound(v[val].begin(), v[val].end(), l); } int main(int argc, char const *argv[]) { scanf("%d %d %d", &N, &R, &Q); for(int i = 1; i <= N; i++) { if(i == 1) scanf("%d", &a[i]); else scanf("%d %d", &p[i], &a[i]); } for(int i = 2; i <= N; i++) { g[p[i]].emplace_back(i); } for(int i = 1; i <= N; i++) { tot[a[i]] += 1; nodes[a[i]].emplace_back(i); } int now = 0; for(int i = 1; i <= R; i++) { if(tot[i] > magic) { current = i; idx[i] = now++; dfs(1, 0); } } go(1); while(Q--) { int p, q; scanf("%d %d", &p, &q); if(tot[p] > magic) { printf("%d\n", ans[idx[p]][q]); } else { int res = 0; for(int i : nodes[p]) { res += count(in[i], out[i], q); } printf("%d\n", res); } fflush(stdout); } return 0; }

Compilation message (stderr)

regions.cpp: In function 'int main(int, const char**)':
regions.cpp:43:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d", &N, &R, &Q);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:45:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   if(i == 1) scanf("%d", &a[i]);
              ~~~~~^~~~~~~~~~~~~
regions.cpp:46:13: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   else scanf("%d %d", &p[i], &a[i]);
        ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:66:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &p, &q);
   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...