제출 #1169601

#제출 시각아이디문제언어결과실행 시간메모리
1169601lightonGame (APIO22_game)C++20
60 / 100
4021 ms122760 KiB
#include "game.h"
#include <bits/stdc++.h>
#define all(v) v.begin(),v.end()
#define forf(i,s,e) for(int i = s; i<=e; i++)
#define forb(i,s,e) for(int i = s; i>=e; i--)
#define idx(i,v) lower_bound(all(v),i)-v.begin()
#define comp(v) v.erase(unique(all(v)),v.end())
#define sz(v) (int)v.size()
#define pb push_back
using namespace std;
int N,K;
int S[1000001][31];
vector<pair<int,int> > adj[1000001],radj[1000001];
void dnc(int dep, int s, int e){
    if(s>e) return;
    int m = s+e>>1;
    forf(i,2*s,2*m) S[i][dep] = 1;
    forf(i,2*m+1,2*e+1) S[i][dep] = 2;
    dnc(dep+1,s,m-1), dnc(dep+1,m+1,e);
}

int f = 0;
int cnt = 0;
void upd(int now){

    if(f==1) return;
    for(auto &[i,p] : adj[now]){
        cnt++;
        //assert(cnt < 20*300000*4);
        while(p<30 && S[i][p] == S[now][p] && S[i][p] != 0) p++;
        if((S[now][p]&2) && (S[i][p]&1)) {f = 1; return;}
        if(S[i][p] == 1 && S[now][p] == 0){
            while(p<30 && S[i][p] == 1) S[now][p] = 1, p++;
            upd(now); return;
        }
    }

    for(auto &[i,p] : radj[now]){
        cnt++;
        //assert(cnt < 20*300000*4);
        while(p<30 && S[i][p] == S[now][p] && S[i][p] != 0) p++;
        if((S[now][p]&1) && (S[i][p]&2)) {f = 1; return;}
        if(S[i][p] == 2 && S[now][p] == 0){
            while(p<30 && S[i][p] == 2) S[now][p] = 2, p++;
            upd(now); return;
        }
    }


    vector<int> v;
    for(auto &[i,p] : adj[now]){
        cnt++;
        //assert(cnt < 20*300000*4);
        if(S[now][p] == 2 && S[i][p] == 0){
            while(p<30 && S[now][p] == 2) S[i][p] = 2, p++;
            v.pb(i);
        }
    }
    for(auto &[i,p] : radj[now]){
        cnt++;
        //assert(cnt < 20*300000*4);
        if(S[now][p] == 1 && S[i][p] == 0){
            while(p<30 && S[now][p] == 1) S[i][p] = 1, p++;
            v.pb(i);
        }
    }

    int s = sz(v);
    sort(all(v)), comp(v);
    assert(sz(v)==s);
    for(auto i : v) upd(i);
}

void init(int n, int k){
    N =n, K=k;
    dnc(0,0,k-1);
    forf(i,0,2*k-2){
        int p = 0;
        while(p<30 && S[i][p] == S[i+1][p] && S[i][p] != 0) p++;
        adj[i].push_back({i+1,p}), radj[i+1].push_back({i,p});
    }
}

int add_teleporter(int u, int v) {
    if(u < K) u = 2*u+1;
    else u += 2*K;
    if(v < K) v = 2*v;
    else v += 2*K;

    int p = 0;
    while(p<30 && S[u][p] == S[v][p] && S[u][p] != 0) p++;
    adj[u].push_back({v,p}), radj[v].push_back({u,p});
    upd(u);

    if(f==1) return 1;
    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...