제출 #133749

#제출 시각아이디문제언어결과실행 시간메모리
133749dvdg6566Toy Train (IOI17_train)C++14
0 / 100
1027 ms1836 KiB
#include "train.h"
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef pair<int,int> pi;
typedef vector<pi> vpi;
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define pb emplace_back
#define mp make_pair
#define MAXN 5010
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()

vi res;
vi U[MAXN],V[MAXN];
vi stat;
int vis[MAXN];
vi bad;
int outdeg[MAXN];
int A[MAXN];
int N;

void dfs(int x){
	for (auto v : V[x])if (vis[v]==0){
		vis[v] = 1;
		dfs(v);
	}
}

queue<int> q;
int done[MAXN];

void dest(int x){
	done[x]=1;
	q.push(x);
	while(SZ(q)){
		int t = q.front();q.pop();
		res[t]=1;
		for (auto i : U[x])if(!done[i]){
			if (A[i] == 1){
				// A owns it then can just remove
				q.push(i);
				done[i]=1;
			}else{
				done[i]=1;
				--outdeg[i];
				if (outdeg[i] == 0)q.push(i);
			}
		}
	}
}

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	N = SZ(a);
	res.resize(N,0);
	for (int i=0;i<N;++i)A[i] = a[i];
	int m = SZ(u);
	for (int i=0;i<m;++i){
		V[u[i]].pb(v[i]);
		U[v[i]].pb(u[i]);
	}
	for (int i=0;i<N;++i)if(r[i])stat.pb(i);
	for (auto i : stat){
		memset(vis,0,sizeof(vis));
		dfs(i);
		if (vis[i]){
			// This station is an exit point 
			bad.pb(i);
		}
	}
	for (auto i : bad){
		dest(i);
	}
	return res;
}
#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...