Submission #1222673

#TimeUsernameProblemLanguageResultExecution timeMemory
1222673AmirAli_H1Toy Train (IOI17_train)C++17
100 / 100
191 ms2372 KiB
// In the name of Allah

#include <bits/stdc++.h>
#include "train.h"
using namespace std;

typedef		long long int			ll;
typedef		long double				ld;
typedef		pair<int, int>			pii;
typedef		pair<ll, ll>			pll;
typedef		complex<ld>				cld;

#define		all(x)					(x).begin(),(x).end()
#define		len(x)					((ll) (x).size())
#define		F						first
#define		S						second
#define		pb						push_back
#define		sep						' '
#define		endl					'\n'
#define		Mp						make_pair
#define		kill(x)					cout << x << '\n', exit(0)
#define		set_dec(x)				cout << fixed << setprecision(x);
#define		file_io(x,y)			freopen(x, "r", stdin); freopen(y, "w", stdout);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int maxn = 2e4 + 4;

int n, m;
pii A[maxn]; vector<int> lsx;
vector<int> adj[maxn], adjr[maxn];
vector<int> M; queue<int> qu;
int D0[maxn], D1[maxn];

void calx() {
	M.clear(); M.resize(n);
	for (int i = 0; i < n; i++) {
		D0[i] = len(adj[i]); D1[i] = 0;
	}
	for (int v : lsx) {
		M[v] = 1; qu.push(v);
	}
	while (!qu.empty()) {
		int v = qu.front(); qu.pop();
		for (int u : adjr[v]) {
			D0[u]--; D1[u]++;
			if (M[u]) continue;
			if (A[u].S == 1 && D1[u] >= 1) {
				M[u] = 1; qu.push(u);
			}
			else if (A[u].S == 0 && D0[u] == 0) {
				M[u] = 1; qu.push(u);
			}
		}
	}
}

vector<int> who_wins(vector<int> ax, vector<int> rx, vector<int> ux, vector<int> vx) {
	n = len(ax); m = len(ux);
	for (int i = 0; i < n; i++) A[i] = Mp(rx[i], ax[i]);
	for (int i = 0; i < m; i++) {
		int u = ux[i], v = vx[i];
		adj[u].pb(v); adjr[v].pb(u);
	}
	for (int i = 0; i < n; i++) {
		if (A[i].F == 1) lsx.pb(i);
	}
	calx();
	while (true) {
		int x = -1;
		for (int v : lsx) {
			if (A[v].S == 1 && D1[v] == 0) {
				x = v; break;
			}
			else if (A[v].S == 0 && D0[v] >= 1) {
				x = v; break;
			}
		}
		if (x == -1) break;
		lsx.erase(find(all(lsx), x));
		calx();
	}
	return M;
}
#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...