Submission #526593

#TimeUsernameProblemLanguageResultExecution timeMemory
526593hibikiCave (IOI13_cave)C++11
100 / 100
810 ms588 KiB
#include "cave.h"
#include<bits/stdc++.h>
using namespace std;

int ask[5050]; // idx=switch
int open[5050]; // idx=door
int link[5050]; // idx=door
int alr[5050]; // idx=switch
int ans[5050];

void exploreCave(int N) {
    int n=N;
    memset(alr,0,sizeof(alr));
    memset(link,-1,sizeof(link));
    memset(open,-1,sizeof(open));

    for(int i=0;i<n;i++)
    {
        // printf("%d: ",i);
        memset(ask,0,sizeof(ask));
        // set to open all of previous door
        for(int j=0;j<i;j++)
        {
            ask[link[j]]=open[j];
        }
        // for(int i=0;i<n;i++)
        // {
        //     printf("%d ",ask[i]);
        // }
        int ret=tryCombination(ask);
        if(ret==i)
            open[i]=1;
        else
            open[i]=0;
        // printf(":: %d\n",open[i]);

        int l=0,r=n-1-i;
        while(l<=r)
        {
            int cnt=0;
            if(l==r)
            {
                // printf("l: %d\n",l);
                for(int j=0;j<n;j++)
                {
                    if(alr[j])continue;
                    if(cnt==l)
                    {
                        // printf("j:%d\n",j);
                        link[i]=j;
                        alr[j]=1;
                        break;
                    }
                    cnt++;
                }
                break;
            }
            int mid=(l+r)/2;
            for(int j=0;j<n;j++)
            {
                if(alr[j])continue;
                if(cnt>=l&&cnt<=mid)ask[j]=open[i];
                else ask[j]=(open[i]+1)%2;
                cnt++;
            }
            ret=tryCombination(ask);
            // printf("mid:%d :: ",mid);
            // for(int i=0;i<n;i++)
            // {
            //     printf("%d ",ask[i]);
            // }
            // printf(":: %d\n",ret);
            if(ret==i)
            {
                l=mid+1;
            }
            else
            {
                r=mid;
            }
        }
    }

    for(int i=0;i<n;i++)
    {
        ans[link[i]]=i;
        ask[link[i]]=open[i];
    }
    // int ok;
    // for(int i=0;i<n;i++)
    // {
    //     printf("%d %d\n",ask[i],ans[i]);
    // }
    // scanf("%d\n",&ok);

    answer(ask,ans);
}
#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...