Submission #211915

#TimeUsernameProblemLanguageResultExecution timeMemory
211915LawlietRegions (IOI09_regions)C++17
27 / 100
8085 ms89588 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int lli; typedef pair<int,int> pii; const int MAXN = 200010; int n, r, q; int curTime; int v[MAXN]; int freq[MAXN]; int tin[MAXN]; int tout[MAXN]; int prof[MAXN]; int indHeavy[MAXN]; int upAnswer[MAXN]; bool isHeavy[MAXN]; vector< int > adj[MAXN]; vector< int > nodes[MAXN]; vector< int > ansHeavy[MAXN]; void DFSInit(int cur) { tin[cur] = ++curTime; for(int i = 0 ; i < adj[cur].size() ; i++) DFSInit( adj[cur][i] ); tout[cur] = curTime; } void DFSCalculate(int cur, int heavyRegion) { if( v[cur] == heavyRegion ) prof[cur]++; for(int i = 0 ; i < adj[cur].size() ; i++) { int viz = adj[cur][i]; prof[viz] = prof[cur]; DFSCalculate( viz , heavyRegion ); } } int lightQuery(int A, int B) { int ans = 0; for(int i = 0 ; i < nodes[A].size() ; i++) { int L = tin[ nodes[A][i] ]; int R = tout[ nodes[A][i] ]; auto itL = lower_bound( nodes[B].begin() , nodes[B].end() , L ); auto itR = upper_bound( nodes[B].begin() , nodes[B].end() , R ); ans += itR - itL; } return ans; } int main() { scanf("%d %d %d",&n,&r,&q); double aux = r; aux /= log2( n ); int T = sqrt( aux ) + 1; scanf("%d",&v[1]); for(int i = 2 ; i <= n ; i++) { int p; scanf("%d %d",&p,&v[i]); adj[p].push_back( i ); } DFSInit( 1 ); for(int i = 1 ; i <= n ; i++) { freq[ v[i] ]++; nodes[ v[i] ].push_back( tin[i] ); } for(int i = 1 ; i <= r ; i++) sort( nodes[i].begin() , nodes[i].end() ); int curInd = 0; for(int i = 1 ; i <= r ; i++) { if( freq[i] < T ) continue; isHeavy[i] = true; indHeavy[i] = ++curInd; prof[1] = 0; DFSCalculate( 1 , i ); for(int j = 1 ; j <= n ; j++) upAnswer[ v[j] ] += prof[j]; for(int j = 1 ; j <= r ; j++) ansHeavy[curInd].push_back( upAnswer[j] ); for(int j = 1 ; j <= r ; j++) upAnswer[j] = 0; } for(int i = 1 ; i <= q ; i++) { int A, B; scanf("%d %d",&A,&B); if( !isHeavy[A] ) printf("%d\n",lightQuery( A , B )); else { int ind = indHeavy[A]; printf("%d\n",ansHeavy[ind][B - 1]); } fflush( stdout ); } }

Compilation message (stderr)

regions.cpp: In function 'void DFSInit(int)':
regions.cpp:32:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0 ; i < adj[cur].size() ; i++)
                  ~~^~~~~~~~~~~~~~~~~
regions.cpp: In function 'void DFSCalculate(int, int)':
regions.cpp:43:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0 ; i < adj[cur].size() ; i++)
                  ~~^~~~~~~~~~~~~~~~~
regions.cpp: In function 'int lightQuery(int, int)':
regions.cpp:57:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0 ; i < nodes[A].size() ; i++)
                  ~~^~~~~~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:73: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:80:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&v[1]);
  ~~~~~^~~~~~~~~~~~
regions.cpp:85:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&p,&v[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~
regions.cpp:126:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&A,&B);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...