Submission #1225104

#TimeUsernameProblemLanguageResultExecution timeMemory
1225104SpyrosAlivGame (APIO22_game)C++20
0 / 100
0 ms408 KiB
#include "game.h"
#include <bits/stdc++.h>
using namespace std;

// for each node store the latest special node it can be reached from (from[u])
// and the earliest special node it can reach (to[u])
// when connecting u and v such that to[v] <= from[u] answer is 1

vector<vector<int>> g, rev;
int n, k;
vector<int> from, to;

void init(int N, int K) {
    n = N;
    k = K;
    g.clear();
    rev.clear();
    from.clear();
    to.clear();
    g.resize(n+1);
    rev.resize(n+1);
    from.assign(n+1, -1);
    to.resize(n+1, n+1);
    for (int i = 1; i <= k; i++) {
        from[i] = i;
        to[i] = i;
    }
    for (int i = 1; i < k; i++) {
        g[i].push_back(i+1);
        rev[i+1].push_back(i);
    }
}

void set_to(int u, int val) {
    if (to[u] <= val) return;
    to[u] = val;
    for (auto next: rev[u]) {
        set_to(next, val);
    }
}

void set_from(int u, int val) {
    if (from[u] >= val) return;
    from[u] = val;
    for (auto next: g[u]) {
        set_from(next, val);
    }
}

int add_teleporter(int u, int v) {
    u++;
    v++;
    if (to[v] <= from[u]) return 1;
    if (u == v && u <= k) return 1;
    if (u == v) return 0;
    g[u].push_back(v);
    rev[v].push_back(u);
    set_to(u, to[v]);
    set_from(v, from[u]);
    //for (int i = 1; i <= n; i++) {
    //  cout << "DEB: " << to[i] << " " << from[i] << "\n";
    //}
    //cout << "\n";
    return 0;
}
#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...