# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1161861 | zyq181 | Library (JOI18_library) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "library.h"
using namespace std;
#define int long long
int N;
vector<int> ask;
vector<int> ask2;
vector<int> ans;
bool determined[1005];
int determinedcnt;
int lastright = -1;
int lastleft = -1;
void side(int lo, int hi){
while(lo < hi){
int m = (lo + hi)/2;
int sz = (m - lo + 1);
fill(ask.begin(), ask.end(), 0);
fill(ask2.begin(), ask2.end(), 0);
int cnt = 0;
for(int a=0; a<N; a++){
if(!determined[a]){
if(cnt < sz){
ask[a] = 1;
cnt++;
}
else{
ask2[a] = 1;
}
}
}
int ret1 = Query(ask);
int ret2 = Query(ask2);
if(ret1 > ret2){
hi = m;
}
else{
lo = m + 1;
}
}
int cntr = 0;
for(int a=0; a<N; a++){
if(!determined[a]){
cntr++;
}
if(cntr == lo) {
cntr = a + 1;
break;
}
}
if(lastright == N && lastleft == -1){
lastleft++;
determined[cntr-1] = true;
ans[lastleft] = cntr;
}
else if(lastright == N){
fill(ask.begin(), ask.end(), 0);
ask[ans[lastleft] - 1] = 1;
ask[cntr-1] = 1;
ret = Query(ask);
if(ret == 1){
lastleft++;
ans[lasleft] = cntr;
determined[cntr-1] = true;
}else{
lastright--;
ans[lastright] = cntr;
determined[cntr-1] = true;
}
}
else{
fill(ask.begin(), ask.end(), 0);
ask[ans[lastright] - 1] = 1;
ask[cntr-1] = 1;
ret = Query(ask);
if(ret == 1){
lastright--;
ans[lastright] = cntr;
determined[cntr-1] = true;
}else{
lastleft++;
ans[lastleft] = cntr;
determined[cntr-1] = true;
}
}
}
void Solve(int N){
lastright = N;
for(int a=0; a<N; a++){
ask.push_back(0);
ask2.push_back(0);
ans.push_back(0);
}
for(int a=0; a<N; a++){
side(1, N-a);
}
Answer(ans);
}