Submission #133771

#TimeUsernameProblemLanguageResultExecution timeMemory
133771dvdg6566Toy Train (IOI17_train)C++14
5 / 100
9 ms1656 KiB
#include "train.h"
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef pair<int,int> pi;
typedef vector<pi> vpi;
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define pb emplace_back
#define mp make_pair
#define MAXN 5010
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
 
vi safe;
int V[MAXN][2];
int memo[MAXN];
int N;

int A[MAXN],R[MAXN];

int ask(int x){
	if (memo[x] != -1)return memo[x];
	if (x == N-1){
		// Must be a self edge
		return memo[x] = R[x];
	}
	if (A[x]){
		// Can choose
		if (V[x][0]){
			if (R[x])return memo[x] = 1;
		}
		if (V[x][1]){
			if (ask(x+1))return memo[x]=1;
		}
		return memo[x] = 0;
	}
	if (!A[x]){
		if (V[x][0]){
			if (!R[x])return memo[x] = 0;
		}
		if (V[x][1]){
			if (!ask(x+1))return memo[x]=0;
		}
		return memo[x] = 1;
	}
	return -1;
}

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	N = SZ(a);
	safe.resize(N,0);
	memset(memo,-1,sizeof(memo));
	for (int i=0;i<N;++i)A[i] = a[i];
	for (int i=0;i<N;++i)R[i] = r[i];
	// for (int i=0;i<N;++i)assert(a[i]==0);
	int M = SZ(u);
	for (int i=0;i<M;++i){
		V[u[i]][v[i]-u[i]] = 1;
		assert(u[i] == v[i] || u[i] + 1 == v[i]);
	}
	for (int i=0;i<N;++i){
		safe[i] = ask(i);
	}
	return safe;
}
#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...