Submission #1135748

#TimeUsernameProblemLanguageResultExecution timeMemory
1135748Saul0906Thousands Islands (IOI22_islands)C++20
55 / 100
31 ms23112 KiB
#include "islands.h" #include <bits/stdc++.h> #define rep(a,b,c) for(ll a=b; a<c; a++) #define repr(a,b,c) for(ll a=b-1; a>c-1; a--) #define repa(a,b) for(auto a:b) #define ll long long #define pll pair<ll, ll> #define pii pair<int, int> #define fi first #define se second #define pb push_back #define mid ((l+r)>>1) #define ppb pop_back #define pf push_front #define all(a) a.begin(),a.end() using namespace std; using vi = vector<int>; template<typename T> using vec = vector<T>; const int N=2e5+5; vec<pii> adj[N]; bool vis[N], vis2[N]; int de[N], n; deque<int> vans, vans2; vi a[N], b[N]; bool solve(int u, int p, int e){ vis[u]=true; int c[4]={-1,-1,-1,-1}; repa(v,adj[u]){ if(v.se==e) continue; if(de[v.se]==u) a[v.fi].pb(v.se); else b[v.fi].pb(v.se); } rep(i,0,n){ while(a[i].size() && b[i].size()){ if(c[0]==-1) c[0]=a[i].back(), c[1]=b[i].back(); else c[2]=a[i].back(), c[3]=b[i].back(); a[i].ppb(); b[i].ppb(); } a[i].clear(); b[i].clear(); } if(min({c[0],c[1],c[2],c[3]})!=-1){ vans={c[0],c[1],c[2],c[3],c[1],c[0],c[3],c[2]}; return true; } repa(v,adj[u]) if(!vis[v.fi] && de[v.se]==u) if(solve(v.fi,u,v.se)){ vans.pf(v.se); vans.pb(v.se); return true; } return false; } stack<pii> stk; bool solve2(int u, int p, int e){ stk.push({u,e}); vis[u]=true; vis2[u]=true; repa(v,adj[u]){ if(de[v.se]!=u) continue; if(!vis[v.fi] && solve2(v.fi,u,v.se)){ if(stk.size() && stk.top().fi==u){ stk.pop(); vans.pf(v.se); vans.pb(v.se); } return true; }else if(vis2[v.fi]){ vans2.pf(v.se); while(stk.top().fi!=v.fi){ vans2.pf(stk.top().se); stk.pop(); } repa(e,vans2) vans.pb(e); repa(e,vans2) vans.pb(e|1); reverse(all(vans2)); repa(e,vans2) vans.pb(e); repa(e,vans2) vans.pb(e|1); stk.pop(); return true; } } vis2[u]=false; stk.pop(); return false; } std::variant<bool, std::vector<int>> find_journey( int N, int M, std::vector<int> U, std::vector<int> V) { vi a, b, ans; n=N; if(N==2){ rep(i,0,M){ if(U[i]==0) a.pb(i); else b.pb(i); } if(a.size()<2 || b.size()<1) return false; ans={a[0],b[0],a[1],a[0],b[0],a[1]}; return ans; } bool sub1=false; rep(i,0,M) adj[U[i]].pb({V[i],i}); rep(i,0,M) adj[V[i]].pb({U[i],i}); rep(i,0,M) if((i&1) && U[i]!=U[i-1]) sub1=true; rep(i,0,M) de[i]=U[i]; if(N<=2) return false; int c[4]={-1,-1,-1,-1}; rep(i,0,M){ if(U[i]==0 && V[i]==1) c[0]=(i); if(U[i]==1 && V[i]==0) c[1]=(i); if(U[i]==0 && V[i]==2) c[2]=(i); if(U[i]==2 && V[i]==0) c[3]=(i); } ans={c[0],c[1],c[2],c[3],c[1],c[0],c[3],c[2]}; if(min({c[0],c[1],c[2],c[3]})!=-1)return ans; if(sub1 && solve(0,-1,-1)){ ans.clear(); repa(e,vans) ans.pb(e); return ans; }else if(solve2(0,-1,-1)){ ans.clear(); repa(e,vans) ans.pb(e); return ans; } return false; }
#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...