제출 #63710

#제출 시각아이디문제언어결과실행 시간메모리
63710MKopchev동굴 (IOI13_cave)C++14
100 / 100
1198 ms644 KiB
#include<bits/stdc++.h> #include "cave.h" using namespace std; const int nmax=5e3+42; int which[nmax]; int sign[nmax]; int now[nmax]; int active[nmax],sz=0; /* bool open[4]={1,1,1,0}; int order[4]={3,1,0,2}; bool open_now[4]; int tryCombination(int nnn[]) { cout<<"testing: ";for(int i=0;i<4;i++)cout<<nnn[i]<<" "; int N=4; for(int i=0;i<N;i++) if(open[i]==nnn[i])open_now[order[i]]=1; else open_now[order[i]]=0; int p=0; while(open_now[p])p++; cout<<" -> "<<p<<endl; if(p==N)return -1; return p; } */ void exploreCave(int N) { memset(which,-1,sizeof(which)); for(int i=0;i<N;i++)//find the i-th { sz=0; for(int j=0;j<N;j++) if(which[j]!=-1)now[j]=sign[j]; else { sz++; active[sz]=j; now[j]=0; } int ans=tryCombination(now); bool sign_now; //assert(ans==-1||ans>=i); if(ans==-1||ans>i)sign_now=0; else sign_now=1; while(sz>1) { int mx=sz/2,pos=1; for(int j=0;j<N;j++) if(which[j]!=-1)now[j]=sign[j]; else { if(pos<=mx&&active[pos]==j)now[j]=sign_now,pos++; else now[j]=!sign_now; } int ans=tryCombination(now); //assert(ans==-1||ans>=i); if(ans==-1||ans>i)sz=mx; else { for(int j=mx+1;j<=sz;j++) active[j-mx]=active[j]; sz=sz-mx; } } sign[active[1]]=sign_now; which[active[1]]=i; //cout<<i<<"-th must be "<<active[1]<<" and the sign is "<<sign_now<<endl; } answer(sign,which); //cout<<"sign: ";for(int i=0;i<N;i++)cout<<sign[i]<<" ";cout<<endl; //cout<<"which: ";for(int i=0;i<N;i++)cout<<which[i]<<" ";cout<<endl; } /* int main() { exploreCave(4); } */
#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...