Submission #1201652

#TimeUsernameProblemLanguageResultExecution timeMemory
1201652adiyer게임 (APIO22_game)C++20
2 / 100
13 ms23932 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 5e5 + 11;

int n, k;
int was[MAXN], good[MAXN], t[4 * MAXN];

vector < int > g[MAXN], a[MAXN];

void upd(int k, int x, int v = 1, int l = 0, int r = n - 1){
    if(l == r){ t[v] += x; return; }
    int md = (l + r) / 2;
    if(k <= md) upd(k, x, v + v, l, md);
    else upd(k, x, v + v + 1, md + 1, r);
    t[v] = max(t[v + v], t[v + v + 1]);
}

int get(int tl, int tr, int v = 1, int l = 0, int r = n - 1){
    if(r < tl || tr < l) return 0;
    if(tl <= l && r <= tr) return t[v];
    int md = (l + r) / 2;
    return max(get(tl, tr, v + v, l, md), get(tl, tr, v + v + 1, md + 1, r));
}

void dfs(int v){
    if(!was[v]) upd(v, 1), was[v] = 1;
    for(int u : g[v])
        if(!was[u])
            dfs(u);
}

void rfs(int v){
    if(!good[v]) upd(v, 1), good[v] = 1;
    for(int u : a[v])
        if(!good[u])
            rfs(u);
}

void init(int _n, int _k) {
    n = _n, k = _k;
    for(int i = 0; i < k - 1; i++) g[i].push_back(i + 1);
    for(int i = 0; i < k; i++) was[i] = 1, upd(i, 1);
}

int add_teleporter(int u, int v){
    if(u >= v && u < k) return 1;
    if(u >= k && v < k && !good[u]) good[u] = 1, upd(u, 1);
    g[u].push_back(v), a[v].push_back(u);
    if(was[u]) dfs(u);
    if(good[u]) rfs(u);
    return get(k, n - 1) > 1;
}
#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...