제출 #1338374

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

using namespace std;

#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define F first
#define S second
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=5e3+10;
const ll inf=1e16;
typedef pair<int,int> pii;

int n,m;
vector<int> g[MAXN],charged,mark;
bool z[MAXN];
stack<int> st;

bool dfs(int x){
	z[x]=1;
	st.push(x);
	bool win=0;
	for(auto u:g[x]){
		if(!z[u]){
			bool ok=dfs(u);
			if(mark[u]!=mark[x]) ok^=1;
			win|=ok;
			continue;
		}
		bool ok=0;
		vector<int> ad;
		while(!st.empty()){
			auto a=st.top(); st.pop(); ad.pb(a);
			ok|=charged[a];
			if(a==u) break;
		}
		reverse(all(ad));
		for(auto a:ad) st.push(a);
		if(!mark[x]) ok^=1;
		win|=ok;
	}
	st.pop();
	z[x]=0;
	return win;
}

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	n=sz(a),m=sz(u);
	charged=r;

	fall(i,0,m-1) g[u[i]].pb(v[i]);

	mark=a;

	vector<int> ans(n);

	fall(i,0,n-1){
		ans[i]=dfs(i);
		if(!mark[i]) ans[i]^=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...