Submission #1333981

#TimeUsernameProblemLanguageResultExecution timeMemory
1333981nguyenLibrary (JOI18_library)C++20
0 / 100
32 ms344 KiB
#include <vector>
#include "library.h"
using namespace std;

int N;
int adj[1005][2];

bool has_neighbor(int i, const vector<int>& S)
{
    if(S.empty()) return false;

    vector<int> M(N,0);

    for(int v : S) M[v] = 1;
    int q1 = Query(M);

    M[i] = 1;
    int q2 = Query(M);

    int neighbors = q1 + 1 - q2;
    return neighbors > 0;
}

int find_neighbor(int i, vector<int> S)
{
    if(S.size() == 1)
        return S[0];

    int mid = S.size()/2;

    vector<int> A(S.begin(), S.begin()+mid);
    vector<int> B(S.begin()+mid, S.end());

    if(has_neighbor(i,A))
        return find_neighbor(i,A);
    else
        return find_neighbor(i,B);
}

void Solve(int n)
{
    N = n;

    for(int i=0;i<N;i++)
        adj[i][0]=adj[i][1]=-1;

    vector<int> all;
    for(int i=0;i<N;i++) all.push_back(i);

    for(int i=0;i<N;i++)
    {
        vector<int> cand;

        for(int j=0;j<N;j++)
            if(j!=i) cand.push_back(j);

        for(int k=0;k<2;k++)
        {
            if(!has_neighbor(i,cand)) break;

            int nb = find_neighbor(i,cand);

            if(adj[i][0]==-1) adj[i][0]=nb;
            else adj[i][1]=nb;

            if(adj[nb][0]==-1) adj[nb][0]=i;
            else adj[nb][1]=i;

            vector<int> next;
            for(int v : cand)
                if(v!=nb) next.push_back(v);

            cand.swap(next);
        }
    }

    int start = 0;
    for(int i=0;i<N;i++)
        if(adj[i][1]==-1)
        {
            start = i;
            break;
        }

    vector<int> res;
    vector<bool> vis(N,false);

    while(true)
    {
        res.push_back(start+1);
        vis[start]=true;

        int nxt=-1;

        if(adj[start][0]!=-1 && !vis[adj[start][0]])
            nxt=adj[start][0];
        else if(adj[start][1]!=-1 && !vis[adj[start][1]])
            nxt=adj[start][1];

        if(nxt==-1) break;

        start=nxt;
    }

    Answer(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...