Submission #974666

#TimeUsernameProblemLanguageResultExecution timeMemory
974666ivazivaCave (IOI13_cave)C++14
0 / 100
2041 ms732 KiB
#include <bits/stdc++.h>
#include "cave.h"

using namespace std;

#define MAXN 5010

int pozicija[MAXN];
int vrata[MAXN];
bool pronadjeno[MAXN];
set<long long> nepronadjeni;

void exploreCave(int N)
{
    for (long long i=0;i<N;i++) pozicija[i]=0;
    for (long long i=0;i<N;i++) pronadjeno[i]=false;
    for (long long i=0;i<N;i++) vrata[i]=-1;
    for (long long i=0;i<N;i++) nepronadjeni.insert(i);
    for (long long i=0;i<N;i++)
    {
        long long ans0=tryCombination(pozicija);
        if (ans0>i or ans0==-1)
        {
            long long l=0,r=nepronadjeni.size()-1;
            long long rez=-1;
            while (l<=r)
            {
                long long mid=(l+r)/2;
                long long brojac=0;
                for (long long p:nepronadjeni)
                {
                    if (brojac>mid) break;
                    pozicija[p]=1-pozicija[p];brojac++;
                }
                long long ans=tryCombination(pozicija);
                if (ans>i or ans==-1) {rez=mid;r=mid-1;}
                else l=mid+1;
                brojac=0;
                for (long long p:nepronadjeni)
                {
                    if (brojac>mid) break;
                    pozicija[p]=1-pozicija[p];brojac++;
                }
            }
            long long brojac=0;
            long long val=-1;
            for (long long p:nepronadjeni)
            {
                if (brojac==rez) {val=p;break;}
                else brojac++;
            }
            pozicija[val]=1;vrata[val]=i;
            pronadjeno[val]=true;
        }
        else
        {
            long long l=0,r=nepronadjeni.size()-1;
            long long rez=-1;
            while (l<=r)
            {
                long long mid=(l+r)/2;
                long long brojac=0;
                for (long long p:nepronadjeni)
                {
                    if (brojac>mid) break;
                    pozicija[p]=1-pozicija[p];brojac++;
                }
                long long ans=tryCombination(pozicija);
                if (ans==i) {rez=mid;r=mid-1;}
                else l=mid+1;
                brojac=0;
                for (long long p:nepronadjeni)
                {
                    if (brojac>mid) break;
                    pozicija[p]=1-pozicija[p];brojac++;
                }
            }
            long long brojac=0;
            long long val=-1;
            for (long long p:nepronadjeni)
            {
                if (brojac==rez) {val=p;break;}
                else brojac++;
            }
            vrata[val]=i;
            pronadjeno[val]=true;
        }
    }
    answer(pozicija,vrata);
}
#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...