Submission #1225470

#TimeUsernameProblemLanguageResultExecution timeMemory
1225470Hamed_GhaffariToy Train (IOI17_train)C++20
100 / 100
470 ms2212 KiB
#include <bits/stdc++.h>
using namespace std;

const int MXN = 5005;

int n;
vector<int> A, R, adj[MXN], g[MXN];
bool mark[MXN], vis[MXN];
int cnt[MXN];

void add(int v, vector<int> &V, bool own) {
	if(cnt[v]<0) return;
	cnt[v] = -1;
	V.push_back(v);
	for(int u : g[v])
		if(!mark[u] && cnt[u]>0) {
			cnt[u]--;
			if(A[u]==own) add(u, V, own);
			else if(cnt[u]==0) add(u, V, own);
		}
}

inline void extend(vector<int> &V, bool own) {
	fill(cnt, cnt+n, 0);
	for(int i=0; i<n; i++)
		if(!mark[i])
			for(int j : g[i])
				cnt[j]++;
	vector<int> tmp;
	while(!V.empty()) {
		tmp.push_back(V.back());
		V.pop_back();
	}
	for(int v : tmp) add(v, V, own);
}

vector<int> who_wins(vector<int> A, vector<int> R, vector<int> U, vector<int> V) {
	::A = A;
	::R = R;
	n = A.size();
	for(int i=0; i<U.size(); i++) {
		adj[U[i]].push_back(V[i]);
		adj[V[i]].push_back(U[i]);
		g[V[i]].push_back(U[i]);
	}
	vector<int> ans(n, 0);
	while(1) {
		vector<int> V, V1;
		for(int i=0; i<n; i++)
			if(!mark[i]) {
				V.push_back(i);
				if(R[i]) V1.push_back(i);
			}
		extend(V1, 1);
		if(V1.size()==V.size()) {
			for(int v : V) ans[v] = 1;
			break;
		}
		for(int v : V) vis[v] = 0;
		for(int v : V1) vis[v] = 1;
		V1.clear();
		for(int v : V)
			if(!vis[v])
				V1.push_back(v);
		extend(V1, 0);
		for(int v : V1) mark[v] = 1;
	}
	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...