Submission #1219244

#TimeUsernameProblemLanguageResultExecution timeMemory
1219244GrayLibrary (JOI18_library)C++20
100 / 100
76 ms928 KiB
#include <bits/stdc++.h>
#include "library.h"
using namespace std;

int query(vector<int> a, int n){
    vector<int> rask(n);
    for (auto ch:a) {
        rask[ch-1]=1;
    }
    int ret=Query(rask);
    return ret;
}

void Solve(int N)
{
    vector<deque<int>> segs = {{1}};
    int prev=1;
    for (int i=2; i<=N; i++){
        vector<int> ask;
        for (auto &x:segs) {
            for (auto y:x) ask.push_back(y);
        }
        ask.push_back(i);
        int ret = query(ask, N);
        if (ret>prev){
            prev=ret; segs.push_back({i});
        }else if (ret==prev){
            int l=-1, r=segs.size()-1;
            while (l+1<r){
                int mid = (l+r)/2; ask.clear();
                for (int j=0; j<=mid; j++){
                    for (auto y:segs[j]) ask.push_back(y);
                }
                ask.push_back(i);
                if (query(ask, N)==mid+1) r=mid;
                else l=mid;
            }
            if (query({i, segs[r][0]}, N)==1) {
                segs[r].push_front(i);
            }else segs[r].push_back(i);
        }else{
            prev=ret;
            int l=-1, r=segs.size()-1;
            while (l+1<r){
                int mid = (l+r)/2; ask.clear();
                for (int j=0; j<=mid; j++){
                    for (auto y:segs[j]) ask.push_back(y);
                }
                ask.push_back(i);
                if (query(ask, N)<=mid+1) r=mid;
                else l=mid;
            }
            int left = r;
            l=0; r=segs.size();
            while (l+1<r){
                int mid = (l+r)/2; ask.clear();
                for (int j=(int)segs.size()-1; j>=mid; j--){
                    for (auto y:segs[j]) ask.push_back(y);
                }
                ask.push_back(i);
                if (query(ask, N)<=(int)segs.size()-mid) l=mid;
                else r=mid;
            }
            int right = l;
            if (query({segs[left][0], i}, N)==1){
                if (query({segs[right][0], i}, N)==1){
                    segs[left].push_front(i);
                    while (!segs[right].empty()) {
                        segs[left].push_front(segs[right].front());
                        segs[right].pop_front();
                    }
                }else{
                    segs[left].push_front(i);
                    while (!segs[right].empty()){
                        segs[left].push_front(segs[right].back());
                        segs[right].pop_back();
                    }
                }
            }else{
                if (query({segs[right][0], i}, N)==1){
                    segs[left].push_back(i);
                    while (!segs[right].empty()) {
                        segs[left].push_back(segs[right].front());
                        segs[right].pop_front();
                    }
                }else{
                    segs[left].push_back(i);
                    while (!segs[right].empty()){
                        segs[left].push_back(segs[right].back());
                        segs[right].pop_back();
                    }
                }
            }
            vector<deque<int>> nsegs;
            for(int j=0; j<(int)segs.size(); j++){
                if (j==right) continue;
                nsegs.push_back(segs[j]);
            }
            segs=nsegs;
        }
    }
    vector<int> ans;
    while (!segs[0].empty()){
        ans.push_back(segs[0].back());
        segs[0].pop_back();
    }
    Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...