Submission #239493

#TimeUsernameProblemLanguageResultExecution timeMemory
239493JatanaToy Train (IOI17_train)C++17
38 / 100
2083 ms1152 KiB
#include "train.h"
#include <iostream>
#define le(v) ((int)v.size())
#define x first
#define y second
#define pb push_back
#define f(i, n) for (int i = 0; i < (n); i++)

using namespace std;

int n, m;
vector<int> who;
vector<vector<int>> g;
vector<int> c;
vector<int> ic;

vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v) {
	g.clear();
	c.clear();
	who.clear();
	who = a;
	n = le(a);
	m = le(u);
	ic = c = r;	
	g.resize(n);
	// cerr <<n << endl;
	// f(i, m) {
		// cerr << u[i] << " " << v[i] << endl;
	// }
	// return c;
	f(i, m) {
		g[u[i]].pb(v[i]);
	}
	vector<bool> dead(n, false);
	while (true) {
		f(i, n) {
			if (dead[i]) {
				c[i] = 0;
			} else c[i] = ic[i];
		}
		while (true) {
			vector<int> was = c;
			for (int i = 0; i < n; i++) {
				if (dead[i]) continue;
				if (c[i] == 1) continue;
				if (who[i] == 1) {
					// indefinitely
					for (int sub : g[i]) {
						if (c[sub]) {
							c[i] = 1;
						}
					}
				} else {
					// finitely
					bool some = false;
					for (int sub : g[i]) {
						if (!c[sub]) {
							some = true;
						}
					}
					if (!some) {
						c[i] = 1;
					}
				}
			}
			if (was == c) break;
		}
		while (true) {
			vector<int> was = c;
			for (int i = 0; i < n; i++) {
				if (dead[i]) continue;
				if (c[i] == 0) continue;
				if (who[i] == 1) {
					// indefinitely
					bool some = false;
					for (int sub : g[i]) {
						if (c[sub]) {
							some = true;
						}
					}
					if (!some) {
						c[i] = 0;
					}
				} else {
					// finitely
					for (int sub : g[i]) {
						if (!c[sub]) {
							c[i] = 0;
						}
					}
				}
			}
			if (was == c) break;
		}
		bool _new = false;
		f(i, n) {
			if (!c[i]) {
				if (!dead[i]) _new = true;
				dead[i] = true;
			}
		}
		if (!_new) break;
	}
	vector<int> out(n);
	f(i, n) {
		if (dead[i]) {
			out[i] = 0;
		} else out[i] = 1;
	}
	return out;
	// vector<int> res(a.size());
	// for(int i = 0; i < (int)res.size(); i++)
	// 	res[i] = i % 2;
	// 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...