Submission #1324216

#TimeUsernameProblemLanguageResultExecution timeMemory
1324216JuanJLToy Train (IOI17_train)C++20
100 / 100
490 ms1948 KiB
#include "train.h"
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i<b;i++)
#define mset(a,v) memset(a,v,sizeof(a))

#ifdef D
#define debug(x) cout<<"	(dbgline) "<< x
#else 
#define debug(x) // nada
#endif

using namespace std;
typedef long long ll;

const int MAXN = 5000+5;

ll n;

ll A[MAXN];
ll R[MAXN];

bool avble[MAXN];
ll NR[MAXN];
ll RES[MAXN];

vector<ll> adj[MAXN];
vector<ll> radj[MAXN];

void expand(ll t){ //t=1 alcanzan los estaciones de carga
	bool vis[n+5];
	mset(vis,false);
	mset(RES,false);

	queue<ll> cola;

	debug("Type "<<t<<'\n');

	ll cnt[n+5];
	forn(i,0,n)if(avble[i]){
		if(t){
			cnt[i]=0;
			for(auto j:adj[i]) if(avble[j]) cnt[i]++;
			if(A[i]) cnt[i]=1;
			if(R[i]){
				cnt[i]=0;
				cola.push(i);
			}
		}else{
			cnt[i]=0;
			for(auto j:adj[i]) if(avble[j]) cnt[i]++;
			if(!A[i]) cnt[i]=1;
			if(NR[i]){
				cnt[i]=0;
				cola.push(i);
			}
		}		
	}

	while(!cola.empty()){
		ll nd = cola.front();
		cola.pop();
		
		if(vis[nd]) continue;
		vis[nd]=true;
		RES[nd]=true;
		debug("alcanza "<<nd<<'\n');

		for(auto i:radj[nd]) if(avble[i]){
			cnt[i]--;
			if(cnt[i]==0) cola.push(i);
		}
	}
}


std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {

	n=SZ(r);
	forn(i,0,SZ(a)) A[i]=a[i];
	forn(i,0,SZ(r)) R[i]=r[i];
	
	forn(i,0,SZ(u)){
		radj[v[i]].pb(u[i]);
		adj[u[i]].pb(v[i]);
	}

	mset(avble,true);
	while(true){
		expand(1);
		ll cnt = 0;
		
		forn(i,0,n){
			if(avble[i] && !RES[i]) NR[i]=true, cnt++;
		}

		if(!cnt){
			vector<int> res;
			forn(i,0,n) if(RES[i]){
				res.pb(1);
			}else res.pb(0);

			return res;
		}
		expand(0);

		forn(i,0,n){
			if(RES[i]) avble[i]=false;
		}

		debug("Nueva Iteracion ");
		forn(i,0,n) debug(avble[i]<<" "); debug('\n');
	}

	vector<int> ress;
	return ress;
}
#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...