|
#include <bits/stdc++.h> |
|
#include "train.h" |
|
#define fi first |
|
#define se second |
|
#define rep(i,n) for(int i = 0; i < (n); ++i) |
|
#define rrep(i,n) for(int i = 1; i <= (n); ++i) |
|
#define drep(i,n) for(int i = (n)-1; i >= 0; --i) |
|
#define each(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++) |
|
#define rng(a) a.begin(),a.end() |
|
#define maxs(x,y) x = max(x,y) |
|
#define mins(x,y) x = min(x,y) |
|
#define pb push_back |
|
#define sz(x) (int)(x).size() |
|
#define pcnt __builtin_popcount |
|
#define uni(x) x.erase(unique(rng(x)),x.end()) |
|
#define snuke srand((unsigned)clock()+(unsigned)time(NULL)); |
|
#define df(x) int x = in() |
|
#define dame { puts("-1"); return 0;} |
|
#define show(x) cout<<#x<<" = "<<x<<endl; |
|
#define PQ(T) priority_queue<T,vector<T>,greater<T> > |
|
#define bn(x) ((1<<x)-1) |
|
#define newline puts("") |
|
#define v(T) vector<T> |
|
#define vv(T) vector<vector<T>> |
|
using namespace std; |
|
typedef long long int ll; |
|
typedef unsigned uint; |
|
typedef unsigned long long ull; |
|
typedef pair<int,int> P; |
|
typedef vector<int> vi; |
|
typedef vector<vi> vvi; |
|
typedef vector<ll> vl; |
|
typedef vector<P> vp; |
|
inline int in() { int x; scanf("%d",&x); return x;} |
|
inline void priv(vi a) { rep(i,sz(a)) printf("%d%c",a[i],i==sz(a)-1?'\n':' ');} |
|
template<typename T>istream& operator>>(istream&i,vector<T>&v) |
|
{rep(j,sz(v))i>>v[j];return i;} |
|
template<typename T>string join(const vector<T>&v) |
|
{stringstream s;rep(i,sz(v))s<<' '<<v[i];return s.str().substr(1);} |
|
template<typename T>ostream& operator<<(ostream&o,const vector<T>&v) |
|
{if(sz(v))o<<join(v);return o;} |
|
template<typename T1,typename T2>istream& operator>>(istream&i,pair<T1,T2>&v) |
|
{return i>>v.fi>>v.se;} |
|
template<typename T1,typename T2>ostream& operator<<(ostream&o,const pair<T1,T2>&v) |
|
{return o<<v.fi<<","<<v.se;} |
|
const int MX = 100005, INF = 1001001001; |
|
const ll LINF = 1e18; |
|
const double eps = 1e-10; |
|
|
|
vi who_wins(vi a, vi r, vi eu, vi ev) { |
|
int n = sz(a); |
|
vvi to(n), ot(n); |
|
rep(i,sz(eu)) to[eu[i]].pb(ev[i]); |
|
rep(i,sz(eu)) ot[ev[i]].pb(eu[i]); |
|
vi selfa(n); |
|
rep(i,n) if (a[i] && !r[i]) { |
|
for (int j : to[i]) if (j == i) selfa[i]++; |
|
} |
|
|
|
vi ans(n,1); |
|
while (1) { |
|
vi ng(n); |
|
{ |
|
queue<int> q; |
|
auto psh = [&](int v) { |
|
if (ng[v]) return; |
|
ng[v] = 1; q.push(v); |
|
}; |
|
rep(i,n) if (r[i] && ans[i]) psh(i); |
|
vi deg(n); |
|
rep(i,n) deg[i] = sz(to[i]); |
|
while (sz(q)) { |
|
int v = q.front(); q.pop(); |
|
for (int u : ot[v]) { |
|
if (a[u]) { |
|
psh(u); |
|
} else { |
|
deg[u]--; |
|
if (!deg[u]) psh(u); |
|
} |
|
} |
|
} |
|
} |
|
|
|
bool upd = false; |
|
rep(i,n) { |
|
if (ans[i] && !ng[i]) { |
|
upd = true; |
|
ans[i] = 0; |
|
} |
|
} |
|
if (!upd) break; |
|
|
|
{ |
|
vi used(n); |
|
queue<int> q; |
|
auto psh = [&](int v) { |
|
if (used[v]) return; |
|
used[v] = 1; |
|
ans[v] = 0; |
|
q.push(v); |
|
}; |
|
rep(i,n) if (!ans[i]) psh(i); |
|
vi deg(n); |
|
rep(i,n) deg[i] = sz(to[i])-selfa[i]; |
|
while (sz(q)) { |
|
int v = q.front(); q.pop(); |
|
for (int u : ot[v]) { |
|
if (!a[u]) { |
|
psh(u); |
|
} else { |
|
deg[u]--; |
|
if (!deg[u]) psh(u); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
return ans; |
|
} |