Submission #1199476

#TimeUsernameProblemLanguageResultExecution timeMemory
1199476user149게임 (APIO22_game)C++20
0 / 100
7 ms14440 KiB
#include<bits/stdc++.h>
#include "game.h"
using namespace std;

int n,k;
vector<int> adjlist[300005];
vector<int> parlist[300005];

int max_source[300005];
int min_reach[300005];
bool ret=0;

void init(int N,int K){
    n=N;
    k=K;
    for(int i=0;i<=k-2;i++){
        adjlist[i].push_back(i+1);
        parlist[i+1].push_back(i);
    }
    for(int i=0;i<=k-1;i++){
        max_source[i]=i-1;
        min_reach[i]=i+1;
    }
    min_reach[k-1]=1e9;

    for(int i=k;i<=n-1;i++){
        max_source[i]=-1;
        min_reach[i]=1e9;
    }
}

void update_source(int node,int a){
    max_source[node]=max(max_source[node],a);
    if(max_source[node]>min_reach[node]){
        ret=1;
        return;
    }

    for(int child:adjlist[node]){
        if(max_source[child]<a){
            update_source(child,a);
        }
    }
}

void update_reach(int node,int a){
    min_reach[node]=min(min_reach[node],a);
    if(max_source[node]>min_reach[node]){
        ret=1;
        return;
    }
    for(int child:parlist[node]){
        if(min_reach[child]>a){
            update_reach(child,a);
        }
    }
}

int add_teleporter(int u,int v){
    adjlist[u].push_back(v);
    parlist[v].push_back(u);
    update_source(v,(u<=k-1?u:max_source[u]));
    update_reach(u,(v<=k-1?v:min_reach[v]));

    // for(int i=0;i<=n-1;i++) cout<<min_reach[i]<<' ';
    // cout<<endl;
    // for(int i=0;i<=n-1;i++) cout<<max_source[i]<<' ';
    // cout<<endl<<endl;

    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...