# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
29880 | aybala | 동굴 (IOI13_cave) | C++11 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define fori(a,b,c) for(int a=b; a<c; a++)
#define ford(a,b,c) for(int a=b; a>=c; a--)
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int n;
int sw[5000];
int used[5000];
pii a[5000],b[5000];
int s[5000],d[5000];
void exploreCave(int N) {
n=N;
int lg=0;
while(1<<lg < n){
lg++;
}
cout << lg;
int nn=(1<<lg);
fori(i,0,n){
int las=0;
int x=0;
fori(j,0,lg+1){
fori(k,las,las+(nn/(1<<(j)))+x){
if(k>=n)
break;
if(!used[k]){
sw[k]=(b[i].se+1)%2;
}
else{
sw[k]=a[k].se;
}
}
int trc=tryCombination(sw);
if(n==1){
if(trc!=i){
b[i].se=1;
}
a[i].fi=i;
a[i].se=b[i].se;
}
if(j==lg){
if(trc!=i){
used[las+1]=1;
b[i].fi=las+1;
a[las+1].fi=i;
a[las+1].se=b[i].se;
}
else{
used[las]=1;
b[i].fi=las;
a[las].fi=i;
a[las].se=b[i].se;
}
break;
}
if(trc!=i && j==0){
b[i].se = 1;
continue;
}
if(trc==i && j==0){
fori(k,las,las+(nn/(1<<(j)))+x){
if(k>=n)
break;
if(!used[k]){
sw[k]=0;
}
else{
sw[k]=a[k].se;
}
}
continue;
}
if(trc!=i && j!=0){
las=las+(nn/(1<<(j)))+x;
continue;
}
if(trc==i && j!=0){
fori(k,las,las+(nn/(1<<(j)))+x){
if(k>=n)
break;
if(!used[k]){
sw[k]=(b[i].se)%2;
}
else{
sw[k]=a[k].se;
}
}
continue;
}
}
}
fori(i,0,n){
s[i]=a[i].se;
d[i]=a[i].fi;
}
answer(s,d);
}