Submission #408463

#TimeUsernameProblemLanguageResultExecution timeMemory
4084638e7Toy Train (IOI17_train)C++14
100 / 100
1033 ms1752 KiB
#include "train.h"
 
//Challenge: Accepted
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <queue>
#define ll long long
#define maxn 5005
#define pii pair<int, int>
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
int own[maxn], del[maxn];
vector<int> adj[maxn], rev[maxn];
vector<int> f(int a, vector<int> st, int n) {
	bool found[n];
	int deg[n];
	for (int i = 0;i < n;i++){ 
		found[i] = 0;
		deg[i] = 0;
		for (int j:adj[i]) {
			if (!del[j]) deg[i]++;
		}
	}
	
	queue<int> que;
	for (int i:st) {
		found[i] = 1;
		que.push(i);
	}	
	while (que.size()) {
		int cur = que.front();que.pop();
		found[cur] = 1;
		for (int v:rev[cur]) {
			if (found[v] || del[v]) continue;
			deg[v]--;
			if (own[v] == a || deg[v] == 0) {
				found[v] = 1;
				que.push(v);
			}
		}
	}
	vector<int> ret (n, 0);
	for (int i = 0;i < n;i++) ret[i] = found[i] ? 1 : 0;
	return ret;
}
std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	int n = a.size(), m = u.size();
	vector<int> b;
	for (int i = 0;i < n;i++){
		own[i] = a[i];
		if (r[i]) b.push_back(i);
	}
	for (int i = 0;i < m;i++) {
		adj[u[i]].push_back(v[i]);
		rev[v[i]].push_back(u[i]);
	}
	vector<int> ret(n, 0);
	while (true) {
		vector<int> fa = f(1, b, n);
		vector<int> t;
		for (int i = 0;i < n;i++) {
			if (!fa[i] && !del[i]) t.push_back(i);
		}
		//cout << endl;
		//for (int i:t) cout << i << " ";
		//cout << endl;
		vector<int> fb = f(0, t, n);
		int found = 0;
		for (int i = 0;i < n;i++) {
			if (fb[i]) {
				found = 1;
				del[i] = 1;
			}
		}
		if (!found) {
			for (int i = 0;i < n;i++) {
				if (fa[i]) ret[i] = 1;
			}
			break;
		}
		vector<int> tmp;
		for (int i:b) {
			if (!del[i]) tmp.push_back(i);
		}
		b = tmp;
	}
	return ret;
}
#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...