Submission #288179

#TimeUsernameProblemLanguageResultExecution timeMemory
288179KastandaLibrary (JOI18_library)C++11
100 / 100
377 ms672 KiB
// M
#include<bits/stdc++.h>
#include "library.h"
using namespace std;
const int N = 1009;
vector < int > Adj[N];

void Solve(int n)
{
        for (int i = 1; i <= n; i ++)
        {
                if ((int)Adj[i].size() == 2)
                        continue;
                vector < int > vec;
                for (int j = i + 1; j <= n; j ++)
                        vec.push_back(j);
                if (!vec.size())
                        continue;

                int le = -1, ri = (int)vec.size() - 1, md;

                vector < int > M(n, 0);
                for (int j : vec)
                        M[j - 1] = 1;
                int wq1 = Query(M);
                M[i - 1] = 1;
                int wq2 = Query(M);
                if (wq1 < wq2)
                        continue;
                while (ri - le > 1)
                {
                        md = (le + ri) >> 1;
                        M = vector < int > (n, 0);
                        for (int j = 0; j <= md; j ++)
                                M[vec[j] - 1] = 1;
                        int t1 = Query(M);
                        M[i - 1] = 1;
                        int t2 = Query(M);
                        if (t1 < t2)
                                le = md;
                        else
                                ri = md;
                }
                Adj[i].push_back(vec[ri]);
                Adj[vec[ri]].push_back(i);
                if (wq1 == wq2)
                        continue;
                assert(wq1 > wq2);
                int id = ri;
                le = ri; ri = (int)vec.size() - 1;
                assert(id < ri);
                while (ri - le > 1)
                {
                        md = (le + ri) >> 1;
                        M = vector < int > (n, 0);
                        for (int j = id + 1; j <= md; j ++)
                                M[vec[j] - 1] = 1;
                        int t1 = Query(M);
                        M[i - 1] = 1;
                        int t2 = Query(M);
                        if (t1 < t2)
                                le = md;
                        else
                                ri = md;
                }
                Adj[i].push_back(vec[ri]);
                Adj[vec[ri]].push_back(i);
        }

        int nw = -1;
        for (int i = 1; i <= n; i ++)
                if ((int)Adj[i].size() == 1)
                        nw = i;
        if (n == 1)
                nw = 1;
        assert(nw != -1);
        int last = -1;
        vector < int > Rs = {nw};
        for (int i = 1; i < n; i ++)
        {
                int tobe = Adj[nw][0];
                if (tobe == last)
                        tobe = Adj[nw][1];
                last = nw;
                nw = tobe;
                Rs.push_back(nw);
        }
        Answer(Rs);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...