제출 #239279

#제출 시각아이디문제언어결과실행 시간메모리
239279lyc장난감 기차 (IOI17_train)C++14
100 / 100
755 ms1528 KiB
#include "train.h" #include <bits/stdc++.h> using namespace std; #define TRACE(x) cout << #x << " :: " << x << endl; #define _ << " " << #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(),(x).end() const int mxN = 5005; int N, M; vector<int> al[mxN]; int deg[mxN], f[mxN]; void calc(bool o, vector<int>& S, vector<int>& a, vector<int>& res) { queue<int> q; fill_n(deg,N,0); memset(f,-1,sizeof f); FOR(i,0,N-1) if (res[i] == -1) { for (int v : al[i]) if (res[v] == -1) ++deg[v]; } for (auto& x : S) f[x] = 1, q.push(x); while (!q.empty()) { int x = q.front(); q.pop(); if (f[x]) { for (int y : al[x]) if (res[y] == -1 && f[y] == -1) { if ((a[y] == o) || (--deg[y] == 0)) f[y] = 1, q.push(y); } } else { for (int y : al[x]) if (res[y] == -1 && f[y] == -1) { if ((a[y] != o) || (--deg[y] == 0)) f[y] = 0, q.push(y); } } } } vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v) { N = SZ(a), M = SZ(u); FOR(i,0,M-1){ al[v[i]].push_back(u[i]); } vector<int> res(N,-1); while (true) { vector<int> S; FOR(i,0,N-1) if (res[i] == -1 && r[i]) S.push_back(i); calc(1,S,a,res); vector<int> T; FOR(i,0,N-1) if (res[i] == -1 && f[i] != 1) T.push_back(i); if (T.empty()) break; if (!T.empty()) { calc(0,T,a,res); FOR(i,0,N-1) if (res[i] == -1 && f[i] == 1) res[i] = 0; } } for (int i = 0; i < N; i++) { if (res[i] == -1) res[i] = 1; } return res; }
#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...