제출 #1350694

#제출 시각아이디문제언어결과실행 시간메모리
1350694Taxiradio장난감 기차 (IOI17_train)C++20
11 / 100
225 ms1604 KiB
#include "train.h"
#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> g , rg;
int n , m;

vector<bool> ask(vector<int> a , vector<int> r){
	vector<bool> ans(n , 0);
	vector<int> d(n , 0);
	queue<int> b;
	for(int i = 0; i < n; i++){
		d[i] = g[i].size();
		if(r[i]){
			ans[i] = 1;
			b.push(i);
		}
	}
	while(!b.empty()){
		int x = b.front();
		b.pop();
		for(int y : rg[x]){
			if(ans[y])continue;
			if(a[y]){
				ans[y] = 1;
				b.push(y);
				continue;
			}
			d[y]--;
			if(d[y] == 0){
				ans[y] = 1;
				b.push(y);
				continue;
			}
		}
	}
	return ans;
} 

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	n = a.size();
	m = u.size();
	g.resize(n);
	rg.resize(n);
	for(int i = 0; i < m; i++){
		g[u[i]].push_back(v[i]);
		rg[v[i]].push_back(u[i]);
	}
	vector<int> ans(n , 0);
	vector<int> d(n , 0);
	queue<int> b;
	vector<bool> o = ask(a , r);
	for(int i = 0; i < n; i++){
		if(!o[i]){
			ans[i] = 1;
			r[i] = 0;
			b.push(i);
		}
	}
	while(!b.empty()){
		int x = b.front();
		b.pop();
		for(int y : rg[x]){
			if(ans[y])continue;
			if(!a[y]){
				ans[y] = 1;
				r[y] = 0;
				b.push(y);
				continue;
			}
			d[y]--;
			if(d[y] == 0){
				ans[y] = 1;
				r[y] = 0;
				b.push(y);
				continue;
			}
		}
		o = ask(a , r);
		for(int i = 0; i < n; i++){
			if(!o[i] && !ans[i]){
				ans[i] = 1;
				r[i] = 0;
				b.push(i);
			}
		}
	}
	for(int i = 0; i < n; i++)ans[i] = !ans[i];
	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...