제출 #1346715

#제출 시각아이디문제언어결과실행 시간메모리
1346715bbartek도서관 (JOI18_library)C++20
100 / 100
86 ms428 KiB
#include "library.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define st first
#define nd second
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll,ll>

const int maxn = 1003;

bool odw[maxn];
int n;

int binsearch(int v){
	vector<int> pyt(n);
	int l = 1,r = n,mid,x,y;
	bool czy;
	//cout<<"siema\n";
	while(l<r){
		mid = (l+r)/2;
		czy = 0;
		for(int i=1;i<l;i++){
			pyt[i-1] = 0;
		}
		for(int i=l;i<=mid;i++){
			if(odw[i])
				pyt[i-1] = 0;
			else{
				pyt[i-1] = 1;
				czy = 1;
			}
		}
		for(int i=mid+1;i<=n;i++){
			pyt[i-1] = 0;
		}

		if(!czy){
			l = mid+1;
			continue;
		}
		x = Query(pyt);
		/*
		cout<<l<<" "<<mid<<" "<<r<<"\n";
		for(auto i : pyt){
			cout<<i<<" ";
		}
		cout<<"\n";
		cout<<x<<" ans\n";
		*/
		pyt[v-1] = 1;
		y = Query(pyt);
		if(y <= x){ //polaczyl sie
			r = mid;
		}
		else{
			l = mid+1;
		}
	}
	//cout<<l<<" nara\n";
	return l;
}

void Solve(int N){
	n = N;
	
	vector<int> res(n);
	vector<int> pref,suf;

	int akt = n,x;
	odw[n] = 1;
	pref.pb(n);
	while(true){
		x = binsearch(akt);
		if(x == n){
			//cout<<akt<<" xd\n";
			break;
		}

		odw[x] = 1;
		pref.pb(x);
		akt = x;
	}

	akt = n;
	while(true){
		x = binsearch(akt);
		if(x == n){
			//cout<<akt<<" xd\n";
			break;
		}

		odw[x] = 1;
		suf.pb(x);
		akt = x;
	}

	int ind = -1;
	for(int i=suf.size()-1;i>=0;i--){
		ind++;
		res[ind] = suf[i];
	}
	for(int i=0;i<pref.size();i++){
		ind++;
		res[ind] = pref[i];
	}

	/*
	for(auto i : res)
		cout<<i<<" ";
	cout<<"\n";
	*/

	Answer(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...