제출 #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...