Submission #1030941

#TimeUsernameProblemLanguageResultExecution timeMemory
1030941vjudge1Cave (IOI13_cave)C++17
100 / 100
490 ms860 KiB
#include "cave.h"

#include<bits/stdc++.h>

int n;
int*right,*rightsw,*loc;
int*tryarr;

int tryall(){
    for(int i=0;i<n;i++){
        if(rightsw[i])tryarr[i]=1;
        else tryarr[i]=0;
    }
    return tryCombination(tryarr);
}

int dd;

int tryrange(int l,int r){
    int cnt=0;
    for(int i=0;i<n;i++){
        if(rightsw[i]!=-1){
            tryarr[i]=rightsw[i];
        }else{
            if(l<=cnt&&cnt<=r)tryarr[i]=right[dd];
            else tryarr[i]=!right[dd];
            cnt++;
        }
    }
    return tryCombination(tryarr);
}
int getme(int p){
    int cnt=0;
    for(int i=0;i<n;i++){
        if(rightsw[i]==-1){
            if(cnt==p)return i;
            cnt++;
        }
    }
    //std::cerr<<cnt<<" "<<p<<"\n";
    assert(0 && "nuh uh");
    return -1;
}

int trylr;

void open(int door){
    dd=door;
    if(right[door]==-1){
        int k=tryall();
        if(k==door){
            right[door]=0;
        }else{
            if(k==-1)k=n;
            for(int i=door;i<k;i++){
                right[i]=1;
            }
            if(k!=n){
                right[k]=0;
            }
        }
    }
    int left=n-door;
    int l=0,r=left-1,ans=r;
    while(l<=r){
        int mid=(l+r)>>1;
        int val=tryrange(l,mid);
        if(val==door){
            l=mid+1;
        }else{
            ans=mid;
            r=mid-1;
        }
    }
    //std::cerr<<getme(ans)<<" "<<door<<"\n";
    int sw=getme(ans);
    loc[sw]=door;
    rightsw[sw]=right[door];
}

void exploreCave(int N) {
    n=N;
    right=new int[N],loc=new int[N],tryarr=new int[N],rightsw=new int[N];
    for(int i=0;i<N;i++){
        right[i]=rightsw[i]=loc[i]=-1;
    }
    for(int i=0;i<N;i++){
        open(i);
    }
    answer(rightsw,loc);
}
#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...