Submission #1348354

#TimeUsernameProblemLanguageResultExecution timeMemory
1348354khanhphucscratchLibrary (JOI18_library)C++20
100 / 100
86 ms512 KiB
#include "library.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> range(int l, int r)
{
    vector<int> ans;
    for(int i = l; i <= r; i++) ans.push_back(i);
    return ans;
}
vector<int> to_binary(vector<int> a, int n)
{
    vector<int> s(n);
    for(int i : a) s[i-1] = 1;
    return s;
}
int ask(vector<int> a)
{
    return Query(a);
}
void Solve(int n)
{
    //Find the first element;
    int l = 1, r = n;
    while(l < r){
        int mid = (l+r)/2;
        vector<int> question = to_binary(range(l, mid), n), rq = question;
        for(int &i : rq) i ^= 1;
        int x = ask(question), y = ask(rq);
        if(x < y) l = mid+1;
        else r = mid;
    }
    vector<int> ans = {r};
    //Now find other elements;
    set<int> candidate;
    for(int i = 1; i <= n; i++) if(i != r) candidate.insert(i);
    while(candidate.size() > 0){
        vector<int> cur;
        for(int i : candidate) cur.push_back(i);
        l = 0, r = cur.size()-1;
        while(l < r){
            int mid = (l+r)/2;
            vector<int> question;
            for(int i = l; i <= mid; i++) question.push_back(cur[i]);
            int x = ask(to_binary(question, n));
            for(int i : ans) question.push_back(i);
            int y = ask(to_binary(question, n));
            if(x == y) r = mid;
            else l = mid+1;
        }
        int u = cur[l];
        ans.push_back(u); candidate.erase(u);
    }
    Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...