제출 #415334

#제출 시각아이디문제언어결과실행 시간메모리
415334CSQ31열대 식물원 (Tropical Garden) (IOI11_garden)C++14
100 / 100
3062 ms78440 KiB
#include "garden.h" #include <bits/stdc++.h> #include "gardenlib.h" using namespace std; #define sz(a) (int)(a.size()) #define pb push_back #define se second typedef vector<vector<int>> vii; typedef pair<int,int> pii; typedef long long int ll; typedef vector<vector<ll>> VII; const int MAXN = 4e5+5; int nxt[MAXN][31]; vector<vector<pii>> g1(MAXN); vii g2(MAXN); void count_routes(int n, int m, int p, int r[][2], int q, int g[]) { for(int i=0;i<m;i++){ g1[r[i][0]].pb({i,r[i][1]}); g1[r[i][1]].pb({i,r[i][0]}); } for(int i=0;i<n;i++)sort(g1[i].begin(),g1[i].end()); for(int i=0;i<n;i++){ int to = g1[i][0].se; if(g1[to][0].se != i){ nxt[i][0] = to; //not beautiful g2[to].pb(i); } else { nxt[i][0] = to+n; g2[to+n].pb(i); } to = (sz(g1[i]) > 1)?g1[i][1].se:g1[i][0].se; if(g1[to][0].se != i){ nxt[i+n][0] = to; //not beautiful g2[to].pb(i+n); } else { nxt[i+n][0] = to+n; g2[to+n].pb(i+n); } } vector<int>cycle(2*n),vis(2*n); int cur = p; while(!vis[cur]){ vis[cur] = 1; cur = nxt[cur][0]; } int len1=-1,len2=-1; int len = 0; while(!cycle[cur]){ cycle[cur] = 1; len++; cur = nxt[cur][0]; } if(cycle[p])len1 = len; cur = p+n; cycle.assign(2*n,0); vis.assign(2*n,0); while(!vis[cur]){ vis[cur] = 1; cur = nxt[cur][0]; } len = 0; while(!cycle[cur]){ cycle[cur] = 1; len++; cur = nxt[cur][0]; } if(cycle[p+n])len2 = len; vii d(2,vector<int>(2*n,-1)); queue<int>qq; qq.push(p); d[0][p] = 0; vis.assign(2*n,0); vis[p] = 1; while(!qq.empty()){ int v = qq.front(); qq.pop(); for(int x:g2[v]){ if(vis[x])continue; vis[x] =1; d[0][x] = d[0][v]+1; qq.push(x); } } d[1][p+n] = 0; qq.push(p+n); vis.assign(2*n,0); vis[p+n] = 1; while(!qq.empty()){ int v = qq.front(); qq.pop(); for(int x:g2[v]){ if(vis[x])continue; vis[x] =1; d[1][x] = d[1][v]+1; qq.push(x); } } for(int i=0;i<q;i++){ int ans = 0; for(int j=0;j<n;j++){ bool ok=0; if(d[0][j] != -1 && ((len1 != -1 && g[i] >= d[0][j] && (g[i]-d[0][j])%len1 == 0) || d[0][j] == g[i]))ok = 1; if(d[1][j] != -1 && ((len2 != -1 && g[i] >= d[1][j] && (g[i]-d[1][j])%len2 == 0) || d[1][j] == g[i]))ok = 1; ans+=ok; } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...