제출 #1257812

#제출 시각아이디문제언어결과실행 시간메모리
1257812nerrrmin스핑크스 (IOI24_sphinx)C++20
36 / 100
34 ms412 KiB
#include "sphinx.h"
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn = 255;
int n, m;
int a[maxn];
vector < int > even, odd;

int ask_even(int st, int fi, int c)
{
    //cout << "ask " << endl;
    vector < int > g(n, 0);
    for (int i = 0; i < n; ++ i)
    {
        if(i & 1)g[i] = c;
        else if(i < st || i > fi)g[i] = n;
        else g[i] = -1;
    }
    int fb = perform_experiment(g);
    return fb;
}
int ask_odd(int st, int fi, int c)
{
    //cout << "ask 2 " << endl;
    vector < int > g(n, 0);
    for (int i = 0; i < n; ++ i)
    {
        if(i % 2 == 0)g[i] = c;
        else if(i < st || i > fi)g[i] = n;
        else g[i] = -1;
    }
    int fb = perform_experiment(g);
    return fb;
}
std::vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y)
{
    n = N;
    m = X.size();
    memset(a, -1, sizeof(a));
    for (int i = 0; i < n; ++ i)
    {
        if(i % 2 == 0)even.pb(i);
        else odd.pb(i);
    }

    for (int c = 0; c < n; ++ c)
    {
        if(even.size() == 0)break;
        int pre = -1;

               if(ask_even(-1, n, c) == n)
               {
                   continue;
               }

       // cout << pre << " " << even.size() << endl;
        int sz = even.size();
        while(pre < sz)
        {
         //   cout << "ehere " << endl;
            int l = pre+1, r = sz-1, mid, ans = sz; /// pyrvoto koeto naebava
            while(l <= r)
            {
                mid = (l + r)/2;
                if(ask_even(even[pre+1], even[mid], c) == n)
                {
                    l = mid + 1;
                }
                else
                {
                    r = mid - 1;
                    ans = mid;
                }
            }
            pre = ans;
            if(ans < even.size())
            {
                int pos = even[ans];
                a[pos] = c;
            }
        }
        even.clear();
        for (int j = 0; j < n; ++ j)
        {
            if(j % 2 == 0)
            {
                if(a[j] == -1)even.pb(j);
            }
        }
    }
    for (int c = 0; c < n; ++ c)
    {
        if(odd.size() == 0)break;
        int v = ask_odd(-1, n, c);
        int cnt = (n - v)/2 + (n - v)%2;
    if(v == n)
            {
                   continue;
            }
        int pre = -1;
        int sz = odd.size();
        while(cnt --)
        {
            int l = pre+1, r = sz-1, mid, ans = sz; /// pyrvoto koeto naebava
            while(l <= r)
            {
                mid = (l + r)/2;
                if(ask_odd(odd[pre+1], odd[mid], c) == n)
                {
                    l = mid + 1;
                }
                else
                {
                    r = mid - 1;
                    ans = mid;
                }
            }
            pre = ans;
            if(ans < odd.size())
            {
                int pos = odd[ans];
                a[pos] = c;
            }
        }
        odd.clear();
        for (int j = 0; j < n; ++ j)
        {
            if(j & 1)
            {
                if(a[j] == -1)odd.pb(j);
            }
        }
    }

    vector < int > res;
    for (int i = 0 ;i < n; ++ i)
        res.pb(a[i]);
    return res;
}
#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...