Submission #1282824

#TimeUsernameProblemLanguageResultExecution timeMemory
1282824MMihalevSphinx's Riddle (IOI24_sphinx)C++20
36 / 100
31 ms420 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include "sphinx.h"
using namespace std;
vector<int>ans,exp1;
int n;
bool check(vector<int>ids,int col)
{
    bool full=1;
    for(int id:ids)
    {
        if(ans[id]==-1)full=0;
    }
    if(full)return 0;

    if(ids.size()==1)
    {
        for(int i=0;i<n;i++)exp1[i]=col;
        exp1[ids[0]]=-1;

        if(perform_experiment(exp1)==1)
        {
            return 1;
        }
        return 0;
    }

    int other;
    if(col==n-1)other=col-1;
    else other=col+1;

    int c1=0,c2=0;
    for(int i=0;i<ids[0];i++)
    {
        c1=1;
        exp1[i]=n;
    }
    for(int i=ids[0];i<=ids.back();i+=2)
    {
        if(ans[i]==-1)exp1[i]=-1;
        else exp1[i]=other;

        if(i+1<=ids.back())exp1[i+1]=col;
    }
    for(int i=ids.back()+1;i<n;i++)
    {
        c2=1;
        exp1[i]=n;
    }

    int cnt=perform_experiment(exp1);

    if(cnt<c1+c2+ids.back()-ids[0]+1)return 1;
    return 0;
}
void rec(vector<int>ids,int col)
{
    if(ids.size()==1)
    {
        ans[ids[0]]=col;
        return;
    }

    int mid=(ids.size()-1)/2;

    vector<int>ids1,ids2;
    for(int i=0;i<ids.size();i++)
    {
        if(i<=mid)ids1.push_back(ids[i]);
        else ids2.push_back(ids[i]);
    }

    if(check(ids1,col))rec(ids1,col);
    else rec(ids2,col);
}
vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y)
{
    n=N;
    exp1.resize(n);
    ans.resize(n);
    for(int i=0;i<n;i++)
    {
        ans[i]=-1;
    }

    vector<int>idseven,idsodd;
    for(int i=0;i<n;i++)
    {
        if(i%2==0)idseven.push_back(i);
        else idsodd.push_back(i);
    }

    for(int col=0;col<n;col++)
    {
        while(1)
        {
            bool full=1;
            for(int id:idseven)
            {
                if(ans[id]==-1)full=0;
            }
            if(full)break;

            if(check(idseven,col))rec(idseven,col);
            else break;
        }


        while(1)
        {
            bool full=1;
            for(int id:idsodd)
            {
                if(ans[id]==-1)full=0;
            }
            if(full)break;

            if(check(idsodd,col))rec(idsodd,col);
            else break;
        }
    }

    return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...