제출 #1208476

#제출 시각아이디문제언어결과실행 시간메모리
1208476Hanksburger장난감 기차 (IOI17_train)C++17
100 / 100
1184 ms1572 KiB
#include "train.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> adj[5005], rev[5005];
vector<int> who_wins(vector<int> a, vector<int> r, vector<int> U, vector<int> V)
{
	int n=a.size();
	vector<int> cnt(n, 0), ok(n, 0), ans(n, 0);
	for (int i=0; i<U.size(); i++)
	{
		adj[U[i]].push_back(V[i]);
		rev[V[i]].push_back(U[i]);
	}
	queue<int> q;
	for (int i=0; i<n; i++)
	{
		if (r[i])
		{
			ok[i]=1;
			q.push(i);
		}
	}
	while (!q.empty())
	{
		int u=q.front();
		q.pop();
		for (int v:rev[u])
		{
			if (ok[v])
				continue;
			if (a[v] || ++cnt[v]==adj[v].size())
			{
				ok[v]=1;
				q.push(v);
			}
		}
	}
	for (int j=0; j<n; j++)
	{
		for (int i=0; i<n; i++)
		{
			cnt[i]=0;
			if (!r[i])
				continue;
			ans[i]=1-a[i];
			for (int v:adj[i])
				if (a[i]^ok[v]^1)
					ans[i]=a[i];
			if (ans[i])
				q.push(i);
		}
		while (!q.empty())
		{
			int u=q.front();
			q.pop();
			for (int v:rev[u])
			{
				if (ans[v])
					continue;
				if (a[v] || ++cnt[v]==adj[v].size())
				{
					ans[v]=1;
					q.push(v);
				}
			}
		}
		if (j<n-1)
			for (int i=0; i<n; i++)
				ok[i]=ans[i], ans[i]=0;
	}
	return ans;
}
#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...