Submission #1169357

#TimeUsernameProblemLanguageResultExecution timeMemory
1169357lighton게임 (APIO22_game)C++20
2 / 100
8 ms14508 KiB
#include "game.h"
#include <bits/stdc++.h>
#define forf(i,a,b) for(int i = a; i<=b; i++)
#define forb(i,b,a) for(int i = b; i>=a; i--)
using namespace std;
int N,K;
int S[300001][21];
vector<int> adj[300001],radj[300001];
void dnc(int dep, int s, int e){
    if(s>e) return;
    int m = s+e>>1;
    S[m][dep] = 3;
    forf(i,s,m-1) S[i][dep] = 1;
    forf(i,m+1,e) S[i][dep] = 2;
    dnc(dep+1,s,m-1), dnc(dep+1,m+1,e);
}

void forward(int now){
    for(auto i : adj[now]){
        int p = 0;
        while(p<20 && (S[now][p]&2) == (S[i][p]&2)) p++;
        if((S[now][p]&2) && S[i][p] == 0) S[i][p] = 2, forward(i);
    }
}
void backward(int now){
    for(auto i : radj[now]){
        int p = 0;
        while(p<20 && (S[now][p]&1) == (S[i][p]&1)) p++;
        if((S[now][p]&1) && S[i][p] == 0) S[i][p] = 1, backward(i);
    }
}

void init(int n, int k){
    N =n, K=k;
    dnc(0,0,k-1);
    forf(i,0,k-2) adj[i].push_back(i+1), radj[i+1].push_back(i);
}
int add_teleporter(int u, int v) {
    int p =0;
    if(u==v){if(u < K) return 1;
    else return 0;
    }
    while(p<20 && (S[u][p] == S[v][p])) p++;
    if((S[u][p]&2) && (S[v][p]&1)) return 1;
    adj[u].push_back(v); radj[v].push_back(u);
    forf(i,0,20) forward(u), backward(v);
    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...