Submission #717240

#TimeUsernameProblemLanguageResultExecution timeMemory
717240Jarif_RahmanToy Train (IOI17_train)C++17
100 / 100
834 ms1968 KiB
#include "train.h"
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define sc second
using namespace std;
typedef long long int ll;
typedef string str;

int n, m;
vector<vector<int>> graph, graphr;
vector<bool> active;
vector<int> A;

template<int P>
vector<bool> reachable_from(vector<int> S){
    vector<bool> bl(n, 0);
    vector<int> cnt(n, 0);
    for(int i = 0; i < n; i++) if(active[i]) for(int x: graph[i]) cnt[i]+=active[x];

    function<void(int)> dfs = [&](int nd){
        if(!active[nd]) return;
        if(A[nd] != P){
            cnt[nd]--;
            if(cnt[nd] > 0) return;
        }
        if(bl[nd]) return;
        bl[nd] = 1;
        for(int x: graphr[nd]) dfs(x);
    };
    for(int x: S){
        cnt[x] = 0;
        dfs(x);
    }

    return bl;
}

vector<int> who_wins(vector<int> _A, vector<int> R, vector<int> U, vector<int> V){
    swap(A, _A);
    n = A.size(), m = U.size();
    graph.resize(n), graphr.resize(n);
    active.assign(n, 1);
    for(int i = 0; i < m; i++) graph[U[i]].pb(V[i]), graphr[V[i]].pb(U[i]);

    vector<int> ans(n, 1);

    while(1){
        vector<int> S;
        for(int i = 0; i < n; i++) if(active[i] && R[i]) S.pb(i);
        auto bl = reachable_from<1>(S);
        S.clear();
        for(int i = 0; i < n; i++) if(active[i] && !bl[i]) S.pb(i);
        if(S.empty()) break;
        bl = reachable_from<0>(S);
        for(int i = 0; i < n; i++) if(bl[i]) active[i] = 0, ans[i] = 0;
    }

    return ans;
}
#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...