제출 #641121

#제출 시각아이디문제언어결과실행 시간메모리
641121ggoh장난감 기차 (IOI17_train)C++14
28 / 100
486 ms45924 KiB
#include "train.h"
#include<bits/stdc++.h>
using namespace std;
#define sz(v) ((int)(v).size())
 
int n,m,ch[5005],is[2],V[5005][5005];
vector<int>G[5005],T;
void f(vector<int> &a)
{
	while(1)
	{
		T.clear();
		for(int i=0;i<n;i++)
		{
			if(!ch[i])
			{
				is[0]=is[1]=0;
				for(auto &k:G[i])
				{
					if(ch[k])
					{
						V[i][k]=1;
						is[1]=1;
					}
					else is[0]=1;
				}
				if((a[i] && is[1]) || (!a[i] && !is[0]))T.push_back(i);
			}
		}
		if(!sz(T))break;
		for(auto &k:T)ch[k]=1;
	}
}
void g(vector<int> &a)
{
	while(1)
	{
		T.clear();
		for(int i=0;i<n;i++)
		{
			if(ch[i])
			{
				is[0]=is[1]=0;
				for(auto &k:G[i])
				{
					if(!ch[k])is[0]=1;
					else
					{
						if(V[i][i] || V[i][k])is[1]=1;
					}
				}
				if((a[i] && !is[1]) || (!a[i] && is[0]))T.push_back(i);
			}
		}
		if(!sz(T))break;
		for(auto &k:T)ch[k]=0;
	}
}
vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v) {
	n=sz(a);m=sz(u);
	vector<int> res(n);
	for(int i=0;i<m;i++)G[u[i]].push_back(v[i]);
	for(int i=0;i<n;i++)
	{
		ch[i]=r[i];
		if(ch[i])V[i][i]=1;
	}
	f(a);
	g(a);
	for(int i=0;i<n;i++)res[i]=ch[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...