제출 #1360578

#제출 시각아이디문제언어결과실행 시간메모리
1360578DanielPr8게임 (APIO22_game)C++20
100 / 100
3941 ms52616 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = int;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;
#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()

vll in, out;
ll k, ans=0;
vll need;
vvl g, g2;
vpl ran, chil;
void init(int n, int K) {
    out = in = vll(n);k=K;
    g2=g = vvl(n);
    ran .pb( {k,-1});
    chil.pb({-1,-1});
    ran .pb( {0,k});
    chil.pb({-1,-1});
}

void gin(ll i, ll v){
    if(!need.empty() && need.back()==v)return;
    if(ran[v].s<=ran[in[i]].s && chil[in[i]].f==-1)return;
    in[i] = v;
    if(in[i]==out[i]){
        need.pb(v);
        return;
    }
    if((ran[in[i]].s>ran[out[i]].s && in[i]!=0 && out[i]!=0) || (i<k && ran[v].f>=i)){
        ans=1;
        need.pb(v);
        return;
    }
    for(ll j: g[i]){
        gin(j, v);
        if(!need.empty() && need.back()==v)return;
    }
}
void gout(ll i, ll v){
    if(!need.empty() && need.back()==v)return;
    if(ran[v].f>=ran[out[i]].f && chil[out[i]].f==-1)return;
    out[i] = v;
    if(in[i]==out[i]){
        need.pb(v);
        return;
    }
    if((ran[in[i]].s>ran[out[i]].s && in[i]!=0 && out[i]!=0) || (i<k && ran[v].s<=i)){
        ans=1;
        need.pb(v);
        return;
    }
    for(ll j: g2[i]){
        gout(j, v);
        if(!need.empty() && need.back()==v)return;
    }
}

void check(){
    if(ans==1)return;
    while(!need.empty()){
        ll o = need.back();
        need.pop_back();
        if(chil[o].f!=-1)continue;
        ll l = ran[o].f, r=ran[o].s;
        ll m = (l+r)/2;
        if(l+1==r){ans=1;return;}

        chil[o] = {ran.size(), ran.size()+1};
        chil.pb({-1,-1});
        chil.pb({-1,-1});
        ran.pb({l,m});
        ran.pb({m,r});

        for(ll i = l; i < m; ++i){
            for(ll j:g[i]){
                gin(j,chil[o].f);
            }
            for(ll j:g2[i]){
                gout(j,chil[o].f);
            }
        }
        for(ll i = m; i < r; ++i){
            for(ll j:g[i]){
                gin(j,chil[o].s);
            }
            for(ll j:g2[i]){
                gout(j,chil[o].s);
            }
        }
    }
}

ll fin(ll x, ll i=1){
    if(chil[i].f==-1)return i;
    if(x<(ran[i].f+ran[i].s)/2)return fin(x, chil[i].f);
    return fin(x, chil[i].s);
}

int add_teleporter(int u, int v) {
    g[u].pb(v);
    g2[v].pb(u);
    if(u<k) gin(v, fin(u));
    else gin(v, in[u]);
    check();
    if(ans==1)return ans;
    if(v<k) gout(u, fin(v));
    else gout(u, out[v]);
    check();
    return ans;
}



// namespace {

// int read_int() {
//   int x;
//   if (scanf("%d", &x) != 1) {
//     fprintf(stderr, "Error while reading input\n");
//     exit(1);
//   }
//   return x;
// }

// }  // namespace

// int main() {
//   int N = read_int();
//   int M = read_int();
//   int K = read_int();
//   std::vector<int> u(M), v(M);
//   for (int i = 0; i < M; ++i) {
//     u[i] = read_int();
//     v[i] = read_int();
//   }

//   init(N, K);
//   int i;
//   for (i = 0; i < M; ++i) {
//     int answer = add_teleporter(u[i], v[i]);
//     if (answer != 0 && answer != 1) {
//       i = -1;
//       break;
//     } else if (answer == 1) {
//       break;
//     }
//   }
//   printf("%d\n", i);
//   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...