Submission #1319595

#TimeUsernameProblemLanguageResultExecution timeMemory
1319595wangzhiyi33Library (JOI18_library)C++20
100 / 100
129 ms3056 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...