이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |