#include "islands.h"
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> pii;
const int MAXN = 1e5+5;
int st, deg[MAXN], vis[MAXN], len[6];
pii nxt[MAXN];
bool stop;
vector <int> in[MAXN], ans;
vector <pii> out[MAXN];
void del(int x) {
deg[x]--;
for (int y : in[x]) {
deg[y]--;
if (!deg[y]) {
del(y);
}
}
}
pii find(int x) {
for (pii y : out[x]) {
if (deg[y.fi] > 0) {
return y;
}
}
return {-1,-1};
}
void goback(int x) {
vector <int> r;
int y = x;
do {
r.push_back(nxt[y].se);
y = nxt[y].fi;
}
while (y != x);
reverse(r.begin(),r.end());
for (int a : r) {
ans.push_back(a);
}
}
void resail(int x) {
vis[x] += 2;
if (vis[x] == 3) {
goback(x);
stop = 1;
vis[x] = 0;
return;
}
if (vis[x] == 4) {
len[4] = ans.size();
return;
}
int z = ans.size();
ans.push_back(nxt[x].se);
resail(nxt[x].fi);
if (vis[x] == 4) {
vis[x] = 0;
len[3] = z;
}
if (vis[nxt[x].fi] == 0) {
vis[x] = 0;
ans.push_back(nxt[x].se);
}
}
void sail(int x) {
vis[x]++;
if (vis[x] == 2) {
len[2] = ans.size();
return;
}
int z = ans.size();
ans.push_back(nxt[x].se);
sail(nxt[x].fi);
if (vis[x] == 2) {
vis[x] = 3;
len[1] = z;
}
if (vis[nxt[x].fi] == 3 || vis[nxt[x].fi] == 0) {
if (vis[nxt[x].fi] == 3) {
vis[nxt[x].fi] = 1;
}
vis[x] = 0;
ans.push_back(nxt[x].se);
}
}
variant<bool,vector<int>> find_journey(int N,int M,vector<int>U,vector<int>V) {
for (int i=0;i<M;i++) {
deg[U[i]]++;
in[V[i]].push_back(U[i]);
out[U[i]].push_back({V[i],i});
}
for (int i=0;i<N;i++) {
if (!deg[i]) {
del(i);
}
}
while (deg[st] < 2) {
if (deg[st] < 1) {
return false;
}
pii x = find(st);
del(st);
st = x.fi;
ans.push_back(x.se);
}
len[0] = ans.size();
for (int i=0;i<N;i++) {
if (deg[i] > 0) {
nxt[i] = find(i);
}
}
for (pii y : out[st]) {
if (deg[y.fi] > 0) {
nxt[N] = y;
}
}
sail(st);
if (vis[st] == 3) {
vis[st] = 1;
}
ans.push_back(nxt[N].se);
resail(nxt[N].fi);
ans.push_back(nxt[N].se);
len[5] = ans.size();
if (!stop) {
for (int i=len[0];i<len[1];i++) {
ans.push_back(ans[i]);
}
for (int i=len[2]-1;i>=len[1];i--) {
ans.push_back(ans[i]);
}
for (int i=len[2];i<len[3];i++) {
ans.push_back(ans[i]);
}
for (int i=len[4]-1;i>=len[3];i--) {
ans.push_back(ans[i]);
}
for (int i=len[4];i<len[5];i++) {
ans.push_back(ans[i]);
}
}
for (int i=len[0]-1;i>=0;i--) {
ans.push_back(ans[i]);
}
return ans;
}
# | 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... |