Submission #116555

#TimeUsernameProblemLanguageResultExecution timeMemory
116555dragonslayeritTropical Garden (IOI11_garden)C++14
49 / 100
73 ms23672 KiB
#include "garden.h" #include "gardenlib.h" #include <vector> #include <queue> #include <cstdio> const int INF=1e9+7; static std::vector<int> adj[100005]; static int to[200005]; static std::vector<int> from[200005]; static int dist[2][200005]; static void bfs(int start,int* dist){ std::queue<int> q; q.push(start); while(!q.empty()){ int node=q.front(); q.pop(); for(int child:from[node]){ if(!dist[child]){ dist[child]=dist[node]+1; q.push(child); } } } } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { for(int i=0;i<M;i++){ adj[R[i][0]].push_back(R[i][1]); adj[R[i][1]].push_back(R[i][0]); } /* for(int i=0;i<N;i++){ printf("adj[%d][0]=%d\n",i,adj[i][0]); if(adj[i].size()>1){ printf("adj[%d][1]=%d\n",i,adj[i][1]); } } */ for(int i=0;i<N;i++){ to[i<<1]=(adj[i][0]<<1)|(i==adj[adj[i][0]][0]); if(adj[i].size()>1){ to[i<<1|1]=(adj[i][1]<<1)|(i==adj[adj[i][1]][0]); }else{ to[i<<1|1]=to[i<<1]; } } /* for(int i=0;i<N*2;i++){ fprintf(stderr,"to[%d,%d]=%d,%d\n",i>>1,i&1,to[i]>>1,to[i]&1); } */ for(int i=0;i<N*2;i++){ from[to[i]].push_back(i); } bfs(P<<1,dist[0]); bfs(P<<1|1,dist[1]); int cycle[2]; cycle[0]=dist[0][P<<1]?dist[0][P<<1]:INF; cycle[1]=dist[1][P<<1|1]?dist[1][P<<1|1]:INF; /* for(int i=0;i<N*2;i++){ fprintf(stderr,"dist[%d,%d]=%d\n",i>>1,i&1,dist[0][i]); } */ for(int q=0; q<Q; q++){ int K=G[q]; int ans=0; for(int i=0;i<N;i++){ /* int x=i<<1; for(int k=0;k<K;k++){ x=to[x]; } if((x>>1)==P){ ans++; } */ if(dist[0][i<<1]) ans+=(K>=dist[0][i<<1]&&(K-dist[0][i<<1])%cycle[0]==0); if(dist[1][i<<1]) ans+=(K>=dist[1][i<<1]&&(K-dist[1][i<<1])%cycle[1]==0); } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...