Submission #1008344

#TimeUsernameProblemLanguageResultExecution timeMemory
1008344bachhoangxuanToy Train (IOI17_train)C++17
100 / 100
479 ms1440 KiB
#include "train.h"
#include<bits/stdc++.h>
using namespace std;

std::vector<int> who_wins(vector<int> A, std::vector<int> R, vector<int> U, vector<int> V) {
	int n=(int)A.size(),m=(int)U.size();
    vector<vector<int>> edge(n);
    for(int i=0;i<m;i++) edge[V[i]].push_back(U[i]);
    vector<int> res(n,1);
    auto f = [&](vector<int> c,int x){
        queue<int> q;
        vector<int> d(n);
        for(int i=0;i<n;i++) for(int v:edge[i]) if(res[i] && res[v]) d[v]++;
        for(int i=0;i<n;i++)  if(res[i] && c[i]) q.push(i);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int v:edge[u]){
                if(c[v] || !res[v]) continue;
                d[v]--;
                if(A[v]==x || !d[v]){
                    c[v]=1;
                    q.push(v);
                }
            }
        }
        return c;
    };
    while(true){
        for(int i=0;i<n;i++) if(!res[i]) R[i]=0;
        vector<int> S=f(R,1);
        int ok=1;
        for(int i=0;i<n;i++){
            if(!res[i]) continue;
            ok&=S[i];S[i]^=1;
        }
        if(ok) break;
        S=f(S,0);ok=1;
        for(int i=0;i<n;i++){
            if(!res[i]) continue;
            ok&=S[i];
            if(S[i]) res[i]=0;
        }
        if(ok) break;
    }
	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...