Submission #137172

#TimeUsernameProblemLanguageResultExecution timeMemory
137172random0029Toy Train (IOI17_train)C++14
100 / 100
370 ms1656 KiB
// ItnoE
#include<bits/stdc++.h>
using namespace std;
const int N = 5005, MXM = 20004;
int n, m, D[N], F[N], M[N], qu[N], DD[N];
bool Bad[N], Can[N];
vector < int > Adj[N], Adt[N];
vector < int > who_wins(vector < int > B, vector < int > S, vector < int > U, vector < int > V)
{
	n = (int)B.size();
	m = (int)U.size();
	for (int i = 0; i < m; i ++)
	{
		Adt[V[i]].push_back(U[i]);
		DD[U[i]] ++;
		D[U[i]] ++;
		F[U[i]] ++;
	}
	bool YAY = 1;
	while (YAY)
	{
		YAY = 0;
		int l = 0, r = 0;
		memset(Bad, 0, sizeof(Bad));
		for (int i = 0; i < n; i ++)
			if (S[i] && !Can[i])
				Bad[i] = 1, qu[r ++] = i;
		for (int i = 0; i < n; i ++)
			D[i] = DD[i];
		while (r - l)
		{
			int v = qu[l ++];
			for (int u : Adt[v])
				if (!Can[u] && !Bad[u])
				{
					if (B[u])
						Bad[u] = 1, qu[r ++] = u;
					else
					{
						D[u] --;
						if (!D[u])
							Bad[u] = 1, qu[r ++] = u;
					}
				}
		}
		l = r = 0;
		for (int i = 0; i < n; i ++)
			if (!Bad[i] && !Can[i])
				Can[i] = 1, qu[r ++] = i, YAY = 1;
		while (r - l)
		{
			int v = qu[l ++];
			for (int u : Adt[v])
				if (!Can[u])
				{
					if (!B[u])
						Can[u] = 1, qu[r ++] = u;
					else
					{
						F[u] --;
						if (!F[u])
							Can[u] = 1, qu[r ++] = u;
					}
				}
		}
	}

	vector < int > res;
	for (int i = 0; i < n; i ++)
		res.push_back(1 - Can[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...