#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |