Submission #1211657

#TimeUsernameProblemLanguageResultExecution timeMemory
1211657jellybeanLibrary (JOI18_library)C++20
100 / 100
151 ms512 KiB
#include <bits/stdc++.h>
#include "library.h"
using namespace std;
#define pb push_back

vector<int>v;
vector<int>help;
int n;
int query(int l, int r, int x){ //queries for the thing adjacent to x
	int sz = r-l+1;
	if(sz == 1){
		return help[l];
	}
	int m = (l+r)/2;
	vector<int>v1;
	for(int i=0; i<n; i++) v1.pb(0);
	for(int i=l; i<=m; i++){
		//cout<<1<<" "<<help[i]-1<<endl;
		v1[help[i]-1] = 1;
	}
	//for(auto i: v1) cout<<i<<" ";
	//cout<<endl;
	int res = Query(v1);
	v1[x-1] = 1;
	int res1 = Query(v1);
	if(res1 <= res){
		return query(l,m,x);
	} else {
		return query(m+1,r,x);
	}
}

void Solve(int N){
	
	n = N;
	for(int i=0; i<n; i++) v.pb(0);
	
	set<int>s;
	for(int i=1; i<=n; i++) s.insert(i);
	
	deque<int>d;
	d.pb(1);
	
	bool f=0;
	while(1){
		//cout<<d.back() <<endl;
		s.erase(d.back());
		if(s.empty()) break;
		for(int i=0; i<n; i++) v[i] = 0;
		for(auto i: s) v[i-1] = 1;
		int res = Query(v);
		//for(auto i: v) cout<<i<<" ";
		//cout<<endl;
		v[d.back()-1] = 1;
		int res1 = Query(v);
		if(res1 > res){ //go to the other end
			f = 1;
			break;
		} else {
			//cout<<1<<endl;
			help.clear();
			v[d.back()-1] = 0;
			for(int i=0; i<n; i++) if(v[i]) help.pb(i+1);
			d.pb(query(0,help.size()-1,d.back()));
		}
	}
	
	if(!f){
		vector<int>ans;
		for(auto i: d) ans.pb(i);
		Answer(ans);
		return;
	}
	
	s.insert(1);
	while(1){
		s.erase(d.front());
		if(s.empty()) break;
		for(int i=0; i<n; i++) v[i] = 0;
		for(auto i: s) v[i-1] = 1;
		help.clear();
		for(int i=0; i<n; i++) if(v[i]) help.pb(i+1);
		d.push_front(query(0,help.size()-1,d.front()));
	}
	
	vector<int>ans;
	for(auto i: d) ans.pb(i);
	Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...