#include<bits/stdc++.h>
#include "library.h"
using namespace std;
vector<int>ans,sisa;
set<int>hmm;
int n;
void reset(vector<int>&t){
for(int q=0;q<t.size();q++){
t[q]=0;
}
}
void kerja(int l,int r){
if(l>r)return;
if(l==r){
ans[l]=sisa[0];
return;
}
vector<int>test;
test.assign(n,0);
int slsh=0;
for(int q=0;q<10;q++){
reset(test);
bool ada=false;
for(auto x : sisa){
if((x>>q)&1){
test[x]=1;
ada=true;
}
}
// for(auto x : test){
// cout<<x<<" ";
// }
// cout<<endl;
if(!ada)continue;
int has1=Query(test);
ada=false;
for(auto x : sisa){
test[x]=1-test[x];
ada|=test[x];
}
if(!ada)continue;
int has2=Query(test);
if(has1==has2){
slsh+=(1<<q);
}
}
vector<int>cand;
for(auto x : hmm){
if(hmm.count(x^slsh) && (x^slsh)>x){
cand.push_back(x);
}
}
sort(cand.begin(),cand.end());
int L=0,R=cand.size()-1;
int mana=0;
while(L<=R){
int mid=(L+R)/2;
reset(test);
for(int q=0;q<=mid;q++){
test[cand[q]]=1;
}
int has1=Query(test);
bool ada=false;
for(auto x : sisa){
test[x]=1-test[x];
if(test[x])ada=true;
}
int has2;
if(ada)has2=Query(test);
if(ada && has1==has2){
mana=mid;
R=mid-1;
}
else{
L=mid+1;
}
}
int a=cand[mana],b=(slsh^a);
if(l>=1){
reset(test);
test[ans[l-1]]=1; test[a]=1;
if(Query(test)!=1){
swap(a,b);
}
}
ans[l]=a,ans[r]=b;
//cout<<a<<" "<<b<<endl;
sisa.erase(find(sisa.begin(),sisa.end(),a));
sisa.erase(find(sisa.begin(),sisa.end(),b));
hmm.erase(a),hmm.erase(b);
kerja(l+1,r-1);
}
void Solve(int N){
n=N;
ans.assign(N,0);
for(int q=0;q<n;q++){
sisa.push_back(q);
hmm.insert(q);
}
kerja(0,N-1);
for(int q=0;q<n;q++){
ans[q]++;
//cout<<ans[q]<<endl;
}
Answer(ans);
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |