Submission #63710

#TimeUsernameProblemLanguageResultExecution timeMemory
63710MKopchevCave (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...