#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |