제출 #1013077

#제출 시각아이디문제언어결과실행 시간메모리
1013077amirhoseinfar1385동굴 (IOI13_cave)C++17
100 / 100
389 ms916 KiB
#include "cave.h" #include<bits/stdc++.h> using namespace std; const int maxn=5000+10; int n,tof,vas[maxn],pa[maxn],vasl[maxn]; vector<int>unnow,ers; int pors(vector<int>ers){ for(int i=0;i<n;i++){ pa[i]=ers[i]; } int z=tryCombination(pa); if(z==-1){ z=n+1; } return z; } vector<int>cand,fake; void solve(int lev){ if(lev==n){ return ; } for(auto x:unnow){ ers[x]=vas[x]; } for(auto x:cand){ ers[x]=0; } int z=pors(ers); if(z==lev){ tof=1; }else if(z>lev){ tof=0; }else{ assert(0); } int low=0,high=(int)cand.size(),mid; while(high-low>1){ mid=(high+low-1)>>1; for(auto x:unnow){ ers[x]=vas[x]; } for(int i=low;i<=mid;i++){ ers[cand[i]]=tof; } for(int i=mid+1;i<(int)cand.size();i++){ ers[cand[i]]=(1^tof); } for(int i=0;i<low;i++){ ers[cand[i]]=(1^tof); } z=pors(ers); if(z==lev){ low=mid+1; }else if(z>lev){ high=mid+1; }else{ assert(0); } } vas[cand[low]]=tof; vasl[cand[low]]=lev; fake.clear(); for(int i=0;i<(int)cand.size();i++){ if(i!=low){ fake.push_back(cand[i]); } } unnow.push_back(cand[low]); swap(cand,fake); return solve(lev+1); } void exploreCave(int N) { n=N; ers.resize(n); for(int i=0;i<n;i++){ cand.push_back(i); } solve(0); answer(vas,vasl); }
#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...