Submission #1283040

#TimeUsernameProblemLanguageResultExecution timeMemory
1283040MMihalevSphinx's Riddle (IOI24_sphinx)C++20
3 / 100
1562 ms2688 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
#include<cstring>
#include "sphinx.h"
using namespace std;
const int MAX_N=252;
vector<int>ans,exp1,tmp;
int n;
int query[2][MAX_N][MAX_N];
bool check(bool wh,int l,int r,set<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.begin()))]=-1;

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

    int cc=0;

    for(int i=0;i<n;i++)exp1[i]=col;
    for(int id:ids)
    {
        exp1[id]=-1;
    }

    for(int id:ids)
    {
        if(ans[id]!=-1)
        {
            if(id>0)cc--;
            if(id<n-1)cc--;
        }
    }

    if(query[wh][l][r]==-1)
    {
        query[wh][l][r]=perform_experiment(exp1);
    }

    int cnt=query[wh][l][r];

    int st=(*(ids.begin())),en=(*(ids.rbegin()));

    if(cnt<cc+(en<n-1)+(st>0)+2*(ids.size())-1)return 1;

    return 0;
}
void rec(bool wh,int l,int r,set<int>ids,int col)
{
    if(ids.size()==1)
    {
        tmp.push_back((*(ids.begin())));
        ans[(*(ids.begin()))]=col;
        return;
    }

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

    vector<int>idd;
    for(int id:ids)idd.push_back(id);

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

    if(check(wh,l,mid,ids1,col))rec(wh,l,mid,ids1,col);
    else rec(wh,mid+1,r,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;
    }

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

    for(int col=0;col<n;col++)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                query[0][i][j]=-1;
                query[1][i][j]=-1;
            }
        }

        tmp.clear();
        while(idseven.size()>0)
        {
            bool full=1;
            for(int id:idseven)
            {
                if(ans[id]==-1)full=0;
            }
            if(full)break;
            if(check(0,0,idseven.size()-1,idseven,col))rec(0,0,idseven.size(),idseven,col);
            else break;
        }
        for(int x:tmp)idseven.erase(x);


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

            if(check(1,0,idsodd.size()-1,idsodd,col))rec(1,0,idsodd.size()-1,idsodd,col);
            else break;
        }
        for(int x:tmp)idsodd.erase(x);
    }

    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...