Submission #1003163

#TimeUsernameProblemLanguageResultExecution timeMemory
1003163mispertionGame (APIO22_game)C++17
60 / 100
4096 ms54608 KiB
#include "game.h"
#include <bits/stdc++.h>

using namespace std;

#define pb(x) push_back(x);

const int N = 5e5;
const int infi = INT_MAX;

vector<int> g[N], ig[N];
int mxs[N], mns[N], n, k;

bool dfsmn(int v){
    bool was = false;
    for(auto u : ig[v]){
        if(mns[u] > mns[v]){
            mns[u] = mns[v];
            if((mns[u] <= mxs[u] && u >= k) || ((mns[u] < mxs[u] && u < k)))
                was = true;
            if(dfsmn(u))
                was = true;
        }
    }
    return was;
}

bool dfsmx(int v){
    bool was = false;
    if((mns[v] <= mxs[v] && v >= k) || ((mns[v] < mxs[v] && v < k)))
        was = true;
    for(auto u : g[v]){
        if(mxs[u] < mxs[v]){
            mxs[u] = mxs[v];
            if(dfsmx(u))
                was = true;
        }
    }
    return was;
}

void init(int _n, int _k) {
    n = _n;
    k = _k;
    for(int i = 0; i < k; i++)
        mns[i] = mxs[i] = i;
    for(int i = k; i < n; i++)
        mns[i] = infi, mxs[i] = -infi;
}

int add_teleporter(int u, int v) {
    if(u == v && u < k)
        return 1;
    if(u == v)
        return 0;
    g[u].pb(v);
    ig[v].pb(u);
    int ret = 0;
    if(mns[v] < mns[u]){
        mns[u] = mns[v];
        if(dfsmn(u))
            ret = 1;
    }
    if(mxs[v] < mxs[u]){
        mxs[v] = mxs[u];
        if(dfsmx(v))
            ret = 1;
    }
  return ret;
}
#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...