Submission #1206463

#TimeUsernameProblemLanguageResultExecution timeMemory
1206463onbertToy Train (IOI17_train)C++20
0 / 100
5 ms1608 KiB
#include "train.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005, INF = 1e6;
int n, m;
vector<int> own, ans, charge;
vector<int> adj[maxn], radj[maxn];
int cnt[maxn];

void dfs(int u) {
    // cout << u << " " << ans[u] << endl;
    for (int v:radj[u]) if (ans[v] == -1) {
        cnt[v]++;
        if (own[v] == 1) {
            if (ans[u]) {
                ans[v] = 1;
                dfs(v);
            }
        } else if (cnt[v] == adj[v].size()) {
            if (own[v] == 1) ans[v] = 0;
            else {
                ans[v] = 1;
                for (int w:adj[v]) ans[v] = min(ans[w], ans[v]);
            }
            dfs(v);
        }
    }
}

vector<int> who_wins(vector<int> A, vector<int> R, vector<int> U, vector<int> V) {
    n = R.size(), m = U.size();
    own = A, charge = R;
    ans.resize(n);
    for (int i=0;i<n;i++) {
        if (charge[i]) ans[i] = 1;
        else ans[i] = -1;
    }
    for (int i=0;i<m;i++) {
        adj[U[i]].push_back(V[i]);
        radj[V[i]].push_back(U[i]);
    }
    for (int i=0;i<n;i++) if (charge[i]) {
        int u = i;
        ans[u] = 1;
        dfs(u);
        int thing;
        if (own[u] == 1) {
            thing = 0;
            for (int v:adj[u]) thing = max(ans[v], thing);
        } else {
            thing = 1;
            for (int v:adj[u]) thing = min(ans[v], thing);
        }
        if (!thing) for (int j=0;j<n;j++) ans[j] = 0;
        break;
    }
    for (int i=0;i<n;i++) if (ans[i] == -1) 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...