Submission #1178327

#TimeUsernameProblemLanguageResultExecution timeMemory
1178327pedroslrey장난감 기차 (IOI17_train)C++20
0 / 100
4 ms1096 KiB
#include <bits/stdc++.h>
#include "train.h"

using namespace std;
using graph = vector<vector<int>>;

vector<int> who_wins(vector<int> own, vector<int> rs, vector<int> us, vector<int> vs) {
	int n = own.size();

	graph G(n);
	for (int i = 0; i < us.size(); ++i)
		G[vs[i]].push_back(us[i]);

	auto reach = [&](vector<bool> &ss) {
		vector<bool> marc = ss;
		
		queue<int> q;
		for (int i = 0; i < n; ++i)
			if (marc[i]) q.push(i);

		vector<int> in(n);
		for (int i = 0; i < n; ++i)
			if (!own[i]) in[i] = G.size();

		while (!q.empty()) {
			int u = q.front(); q.pop();

			for (int v: G[u]) if (!marc[v]) 
				if (own[v]) { marc[v] = true; q.push(v); }
				else { --in[v]; if (in[v] == 0) { marc[v] = true; q.push(v); }}
		}

		return marc;
	};

	vector<bool> rline(rs.begin(), rs.end());

	while (true) {
		vector<bool> fs = reach(rline);

		bool change = false;
		for (int u = 0; u < n; ++u) if (rline[u])
			if (own[u]) {
				bool ok = false;
				for (int v: G[u])
					if (fs[v]) ok = true;
				if (!ok) { rline[u] = false; change = true; }
			}
			else {
				bool ok = true;
				for (int v: G[u])
					if (!fs[v]) ok = false;

				if (!ok) { rline[u] = false; change = true; }
			}

		if (!change) break;
	}

	auto ans = reach(rline);

	return vector<int>(ans.begin(), ans.end());
}
#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...