Submission #1340008

#TimeUsernameProblemLanguageResultExecution timeMemory
1340008settopToy Train (IOI17_train)C++20
0 / 100
21 ms2008 KiB
#include "train.h"
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define F first
#define S second
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=5e3+10;
const ll inf=1e16;
typedef pair<int,int> pii;

int n,id[MAXN],mn[MAXN],cur,pai[MAXN],grau[MAXN],gr2[MAXN];
vector<int> a,dp;
vector<int> g[MAXN],g2[MAXN],rev[MAXN];
bool inst[MAXN],z[MAXN],mark[MAXN],has[MAXN];
stack<int> st;

void dfs(int x){
	id[x]=mn[x]=++cur;
	z[x]=1;
	inst[x]=1;
	st.push(x);
	for(auto u:g[x]){
		if(!z[u]){
			dfs(u);
			mn[x]=min(mn[x],mn[u]);
		}
		else if(inst[u]) mn[x]=min(mn[x],mn[u]);
	}
	if(mn[x]==id[x]){
		int v;
		do{
			v=st.top(); st.pop();
			pai[v]=x;
			inst[v]=0;
		}while(v!=x);
	}
}

void solve(vector<int> v,int val){
	queue<int> fila;
	for(auto x:v){
		for(auto u:g[x]){
			if(pai[u]==pai[x]) continue;
			if(dp[u]==a[x]){
				has[x]=1;
				dp[x]=a[x];
				fila.push(x);
				break;
			}
		}
	}
	while(!fila.empty()){
		auto x=fila.front(); fila.pop();
		for(auto u:rev[x]){
			if(has[u]) continue;
			if(a[u]==dp[x]){
				has[u]=1;
				fila.push(u);
				dp[u]=dp[x];
				continue;
			}
			gr2[u]--;
			if(!gr2[u]){
				fila.push(u);
				dp[u]=(a[u]^1);
				has[u]=1;
			}
		}
	}
	for(auto x:v) if(!has[x]) dp[x]=val;
}

std::vector<int> who_wins(std::vector<int> A, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	a=A;
	n=sz(a);
	dp.resize(n);
	fall(i,0,sz(u)-1) g[u[i]].pb(v[i]);
	fall(i,0,n-1) if(!id[i]) dfs(i);

	fall(i,0,n-1){
		mark[i]=r[i];
		int x=pai[i];
		for(auto u:g[x]){
			u=pai[u];
			if(u==x){
				rev[u].pb(x);
				gr2[x]++;
				continue;
			}
			grau[x]++;
			g2[u].pb(x);
		}
	}
	queue<int> fila;
	fall(i,0,n-1) if(pai[i]==i && !grau[i]) fila.push(i);
	while(!fila.empty()){
		auto x=fila.front(); fila.pop();
		bool isg=0;
		vector<int> v;
		fall(i,0,n-1)
			if(pai[i]==x){
				v.pb(i);
				isg|=mark[i];
			}
		if(!isg) solve(v,0);
		else solve(v,1);
		for(auto u:g2[x]){
			grau[u]--;
			if(!grau[u]) fila.push(u);
		}
	}
	return dp;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...