Submission #1362080

#TimeUsernameProblemLanguageResultExecution timeMemory
1362080xorshiftGame (APIO22_game)C++20
30 / 100
4070 ms64688 KiB
#include <bits/stdc++.h>
using namespace std;
using vint = vector<int>;
using ll = long long;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using pill = pair<int, ll>;
using vpill = vector<pill>;
using plli = pair<ll, int>;
using vplli = vector<plli>;
#define fi first
#define se second
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for(int i = (n)-1; i >= 0; --i)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a)-1; i >= (b); --i)

const int MAX_N = 3e5;
int n_ctr = 0;
bool k_can_reach[MAX_N], can_reach_k[MAX_N];
struct Node {
    set<int> parents, children;
} k_reach_nodes[MAX_N], nodes_reach_k[MAX_N];

int n_val, k_val;
vector<Node> gnodes;
void init(int n, int k) {
    n_val = n, k_val = k;
    gnodes = vector<Node>(n);
}

int add_teleporter(int u, int v) {
    if (u < k_val && v < k_val) {
        if (v <= u) return 1;
        return 0;
    }
    if (u == v) return 0;
    gnodes[u].children.insert(v);
    gnodes[v].parents.insert(u);

    int reach_k_fw = k_val;
    vector<bool> dfs_fw_visited(n_val);
    auto dfs_fw = [&](auto& self, int val) -> void {
        if (val < k_val) reach_k_fw = min(reach_k_fw, val);
        dfs_fw_visited[val] = true;
        for (auto& c: gnodes[val].children)
            if (!dfs_fw_visited[c]) self(self, c);
    };
    dfs_fw(dfs_fw, v);
    int reach_k_bw = -1;
    vector<bool> dfs_bw_visited(n_val);
    auto dfs_bw = [&](auto& self, int val) -> void {
        if (val < k_val) reach_k_bw = max(reach_k_bw, val);
        dfs_bw_visited[val] = true;
        for (auto& p: gnodes[val].parents)
            if (!dfs_bw_visited[p]) self(self, p);
    };
    dfs_bw(dfs_bw, u);
    if (reach_k_fw <= reach_k_bw) return 1;
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...