# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
64749 | 2018-08-05T14:11:48 Z | TadijaSebez | 열대 식물원 (Tropical Garden) (IOI11_garden) | C++11 | 0 ms | 0 KB |
#include "garden.h" #include <stdio.h> #include <vector> #include <algorithm> using namespace std; #define pb push_back const int N=150050; const int M=2*N; int go[M],lo[N],dep[M]; vector<int> E[M]; void DFS(int u, int p) { for(int i=0;i<E[u].size();i++) { int v=E[u][i]; dep[v]=dep[u]+1; if(v!=p) DFS(v,p); } } pair<int,int> Qs[N]; int cnt[N],sol[N]; void count_routes(int n, int m, int p, int r[][2], int q, int k[]) { int i,j; for(i=0;i<q;i++) Qs[i].first=k[i],Qs[i].second=i; sort(Qs,Qs+q); for(i=0;i<n;i++) lo[i]=-1; for(i=0;i<n;i++) go[i]=-1; for(i=0;i<m;i++) { if(lo[r[i][0]<<1]==-1) lo[r[i][0]<<1]=i; else if(lo[r[i][0]<<1|1]==-1) lo[r[i][0]<<1|1]=i; if(lo[r[i][1]<<1]==-1) lo[r[i][1]<<1]=i; else if(lo[r[i][1]<<1|1]==-1) lo[r[i][1]<<1|1]=i; } for(i=0;i<n*2;i++) { int x=lo[i]; if(lo[i]==-1) x=lo[i-1]; int v=r[x][0]; if(v==i/2) v=r[x][1]; if(x==lo[v<<1]) go[i]=v<<1|1; else go[i]=v<<1; } for(i=0;i<2*n;i++) { E[go[i]].pb(i); dep[i]=-1; } dep[p<<1]=0; DFS(p<<1,p<<1); if(dep[p<<1]) { for(i=0;i<2*n;i+=2) if(dep[i]!=-1) cnt[dep[i]]++; for(i=0;i<q;i++) sol[i]+=cnt[k[i]]; for(i=0;i<2*n;i+=2) if(dep[i]!=-1) cnt[dep[i]]--; } else { int cyc=dep[p<<1]; j=0; vector<int> Ds; for(i=0;i<2*n;i+=2) if(dep[i]!=-1) Ds.pb(dep[i]); sort(Ds.begin(),Ds.end()); for(i=0;i<q;i++) { while(j<Ds.size() && Ds[j]<=Qs[i].first) cnt[Ds[j]%cyc]++,j++; sol[Qs[i].second]+=cnt[Qs[i].first%cyc]; } for(i=0;i<cyc;i++) cnt[i]=0; } for(i=0;i<2*n;i++) dep[i]=-1; dep[p<<1|1]=0; DFS(p<<1|1,p<<1|1); if(dep[p<<1|1]) { for(i=0;i<2*n;i+=2) if(dep[i]!=-1) cnt[dep[i]]++; for(i=0;i<q;i++) sol[i]+=cnt[k[i]]; for(i=0;i<2*n;i+=2) if(dep[i]!=-1) cnt[dep[i]]--; } else { int cyc=dep[p<<1|1]; j=0; vector<int> Ds; for(i=0;i<2*n;i+=2) if(dep[i]!=-1) Ds.pb(dep[i]); sort(Ds.begin(),Ds.end()); for(i=0;i<q;i++) { while(j<Ds.size() && Ds[j]<=Qs[i].first) cnt[Ds[j]%cyc]++,j++; sol[Qs[i].second]+=cnt[Qs[i].first%cyc]; } for(i=0;i<cyc;i++) cnt[i]=0; } for(i=0;i<q;i++) answer(sol[i]); }