Submission #1010309

#TimeUsernameProblemLanguageResultExecution timeMemory
1010309CSQ31Thousands Islands (IOI22_islands)C++17
38.25 / 100
90 ms47648 KiB
#include "islands.h" #include<bits/stdc++.h> #include <variant> #include <vector> using namespace std; #define sz(a) (int)(a.size()) #define pb push_back #define fi first #define se second typedef pair<int,int> pii; const int MAXN = 5e5+5; bool dead[MAXN],mark[MAXN]; int outdeg[MAXN],par[MAXN],vis[MAXN]; vector<pii>g[MAXN],gr[MAXN]; vector<int>path,cycle; void rev(vector<int>&a){reverse(a.begin(),a.end());} bool dfs(int v,int root){ vis[v] = 1; for(pii z:g[v]){ int x = z.fi; if(mark[x])continue; if(vis[x]){ int cur = v; while(cur != x){ cycle.pb(cur); cur = par[cur]; } cycle.pb(x); rev(cycle); if(cur != root){ while(cur != root){ path.pb(cur); cur = par[cur]; } } path.pb(root); rev(path); return 1; }else{ par[x] = v; if(dfs(x,root))return 1; } } return 0; } variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V){ for(int i=0;i<M;i++){ gr[V[i]].pb({U[i],i}); g[U[i]].pb({V[i],i}); outdeg[U[i]]++; } vector<int>del; for(int i=0;i<N;i++){ //cout<<i<<" "<<sz(g[i])<<'\n'; if(g[i].empty()){ del.pb(i); mark[i] = 1; } } int cur = 0; vector<int>ans; while(true){ if(mark[cur])return false; while(!del.empty()){ vector<int>tmp; for(int u:del){ //cout<<u<<'\n'; for(pii x:gr[u]){ int v = x.fi; outdeg[v]--; dead[x.se] = 1; if(!outdeg[v] && !mark[v]){ tmp.pb(v); mark[v] = 1; } } } del = tmp; } if(mark[cur])return false; int cnt = 0; for(pii x:g[cur]){ if(!mark[x.fi])cnt++; } if(cnt > 1)break; if(cnt == 0)return false; for(pii x:g[cur]){ if(!mark[x.fi]){ del.pb(cur); mark[cur] = 1; ans.pb(x.se); cur = x.fi; break; } } } int fix = 0; vector<vector<int>>p,c; for(pii x:g[cur]){ if(mark[x.fi])continue; if(sz(p)>1)break; path.clear(); cycle.clear(); for(int i=0;i<N;i++)vis[i] = par[i] = 0; fix = x.se; vis[cur] = 1; par[x.fi] = cur; dfs(x.fi,cur); p.pb(path); c.pb(cycle); } bool case2 = 0; vector<int>tmp = ans; vector<int>p1,p2,c1,c2; vector<bool>incyc(N,0); for(int i=0;i+1<sz(p[0]);i++){ int v = p[0][i]; int u = p[0][i+1]; for(pii x:g[v]){ if(x.fi == u){ p1.pb(x.se); break; } } } for(int i=0;i<sz(c[0]);i++){ int v = c[0][i]; int u = c[0][(i+1)%sz(c[0])]; incyc[v] = 1; for(pii x:g[v]){ if(x.fi == u){ c1.pb(x.se); break; } } } int tail = 0; for(int i=0;i+1<sz(p[1]);i++){ int v = p[1][i]; int u = p[1][i+1]; for(pii x:g[v]){ if(x.fi == u){ if(i)p2.pb(x.se); else p2.pb(fix); break; } } if(incyc[u]){ tail = u; case2 = 1; break; } } if(!case2){ for(int i=0;i<sz(c[1]);i++){ int v = c[1][i]; int u = c[1][(i+1)%sz(c[1])]; for(pii x:g[v]){ if(x.fi == u){ c2.pb(x.se); break; } } if(incyc[u]){ tail = u; case2 = 1; break; } } } ////// if(case2){ for(int x:p1)ans.pb(x); for(int x:c1)ans.pb(x); rev(p1); for(int x:p1)ans.pb(x); for(int x:c2)p2.pb(x); for(int x:p2)ans.pb(x); int shft = 0; for(int i=0;i<sz(c[0]);i++){ if(c[0][(i+1)%sz(c[0])]==tail){ shft = i; break; } } int m = sz(c1); for(int i=0;i<sz(c1);i++)ans.pb(c1[(shft+m-i)%m]); rev(p2); for(int x:p2)ans.pb(x); }else{ for(int x:p1)ans.pb(x); for(int x:c1)ans.pb(x); rev(p1); for(int x:p1)ans.pb(x); rev(p1);rev(c1); for(int x:p2)ans.pb(x); for(int x:c2)ans.pb(x); rev(p2); for(int x:p2)ans.pb(x); rev(p2);rev(c2); for(int x:p1)ans.pb(x); for(int x:c1)ans.pb(x); rev(p1); for(int x:p1)ans.pb(x); rev(p1); for(int x:p2)ans.pb(x); for(int x:c2)ans.pb(x); rev(p2); for(int x:p2)ans.pb(x); rev(p2); } rev(tmp); for(int x:tmp)ans.pb(x); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...