Submission #1334613

#TimeUsernameProblemLanguageResultExecution timeMemory
1334613kenkunkinLibrary (JOI18_library)C++20
0 / 100
8 ms412 KiB
#include <bits/stdc++.h>
#include "library.h"

using namespace std;

typedef pair<int,int> pii;
const int maxn=1e3+5;

vector<int> b;
vector<int> g[maxn];
int m=0,n;

void flip(vector<int> &v)
{
    int i=0,j=v.size()-1;
    while (i<=j)
    {
        swap(v[i],v[j]);
        i++,j--;
    }
}

int check(int l,int r,int id)
{
    int com=0;
    vector<int> v(n);
    for (int i=0;i<n;i++) v[i]=0;

    v[id]=1;

    for (int i=l;i<=r;i++)
    {
        if (g[i].empty()) continue;
        com++;
        for (int j=0;j<g[i].size();j++)
            v[g[i][j]]=1;
    }

    return com-Query(v);
}

int xuly(int id,int l,int r)
{
    int lo=l,hi=r,ans=l;

    while (lo<=hi)
    {
        int mi=(lo+hi)/2;

        if (check(lo,mi,id)==0)
        {
            ans=mi;
            hi=mi-1;
        }
        else
        {
            if (mi+1<=hi)
                ans=mi+1;
            lo=mi+1;
        }
    }

    return ans;
}

int sum=0;

void Solve(int N)
{
    n=N;
    m=0;
    sum=0;

    for (int i=0;i<maxn;i++) g[i].clear();

    b.resize(n);
    for (int i=0;i<n;i++) b[i]=0;

    for (int i=0;i<n;i++)
    {
        b[i]=1;

        int sum2=Query(b);

        if (sum2-sum==1)
        {
            g[++m].push_back(i);
        }
        else if (sum2-sum==0)
        {
            int id=xuly(i,1,m);

            if (g[id].empty()) continue;

            int l=g[id][0],r=g[id].back();

            vector<int> v(n);
            for (int j=0;j<n;j++) v[j]=0;

            v[r]=1;
            v[i]=1;

            if (Query(v)>1)
                flip(g[id]);

            g[id].push_back(i);
        }
        else
        {
            int lo=1,hi=m;
            int x=-1,y=-1;

            while (lo<=hi)
            {
                int mi=(lo+hi)/2;

                int bien=check(lo,mi,i);

                if (bien==-1) hi=mi-1;
                else if (bien==1) lo=mi+1;
                else
                {
                    x=xuly(i,lo,mi);

                    if (mi+1<=hi)
                        y=xuly(i,mi+1,hi);

                    break;
                }
            }

            if (x==-1 || y==-1) continue;
            if (g[x].empty() || g[y].empty()) continue;

            vector<int> v(n);

            for (int j=0;j<n;j++) v[j]=0;
            v[i]=1;
            v[g[x].back()]=1;

            if (Query(v)>1)
                flip(g[x]);

            g[x].push_back(i);

            for (int j=0;j<n;j++) v[j]=0;
            v[i]=1;
            v[g[y][0]]=1;

            if (Query(v)>1)
                flip(g[y]);

            for (int j=0;j<g[y].size();j++)
                g[x].push_back(g[y][j]);

            g[y].clear();
        }

        sum=sum2;
    }

    for (int i=1;i<=m;i++)
        if (!g[i].empty())
        {
            for (int j=0;j<g[i].size();j++)
                g[i][j]++;

            Answer(g[i]);
            return;
        }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...