제출 #1340862

#제출 시각아이디문제언어결과실행 시간메모리
1340862jenterjongle45도서관 (JOI18_library)C++20
0 / 100
14 ms428 KiB
#include<bits/stdc++.h>
#include "library.h"
using namespace std;
int n;
vector<int> st;
vector<set<int>> adj;
void F(int l,int r,int x){
	vector<int> L(n),R(n);
	if(l==r){
		if(l==x||adj[l].count(x)) return;
		L[x]=L[l]=1;
		if(Query(L)==1){
			adj[x].insert(l);
			adj[l].insert(x);
		}
		return;
	}
	int mid=(l+r)/2;
	L[st[0]]=L[st[1]]=R[st[0]]=R[st[1]]=L[x]=1;
	for(int i=l;i<=mid;i++) L[i]=R[i]=1;
	R[x]=0;
	int W=Query(L);
	int Z=Query(R);
	if(W>=Z) F(mid+1,r,x);
	if(W<=Z) F(l,mid,x);


}
//4 2 5 3 1
void Solve(int N){
	vector<int> ret,Ask(N,1),used(N);
	adj.resize(N);
	n=N;
	for(int i=0;i<N;i++){
		Ask[i]=0;
		int x=Query(Ask);
		Ask[i]=1;
		if(x==1){
			st.push_back(i);
			if(st.size()==2) break; 
		}	
	}
	if(N<=2) return void(Answer(st));
	ret.push_back(st[0]);
	used[st[0]]=1;
	int now=st[0];
	vector<int> ask(N),a2(N),B;
	while(ret.size()<N-1){
		// cout<<now<<'\n';
		for(int i=0;i<n;i++) if(!used[i]) B.push_back(i);
		int l=0,r=B.size()-1,mid,ans=0;
		while(l<=r){
			mid=(l+r)/2;
			for(int i=0;i<n;i++){
				if((B[l]<=i&&i<=B[mid])||used[i]) ask[i]=1;
				else ask[i]=0;
			}
			ask[st[1]]=0;
			a2=ask;
			a2[ret.back()]=0;
			int X=Query(ask),Y=Query(a2);
			if(ret.size()==1){
				if(X==Y) ans=B[mid],r=mid-1;
				else l=mid+1;
			}
			else{
				if(Y>X) ans=B[mid],r=mid-1;
				else l=mid+1;
			}
		}
		used[ans]=1;
		now=ans;
		ret.push_back(ans);
		B.clear();
	}
	ret.push_back(st[1]);
	for(int &x:ret) x++;
	Answer(ret);
}


/*
vector<int> M(N);
	vector<vector<int>> adj(N);
	for(int i=0;i<N;i++){
		M[i]=1;
		for(int j=i+1;j<N;j++){
			if(adj[j].size()>=2) continue;
			M[j]=1;
			int x=Query(M);
			M[j]=0;
			if(x==1) adj[i].push_back(j),adj[j].push_back(i);
		}
		M[i]=0;
	}
	vector<int> vis(N);
	int st;
	for(int i=0;i<N;i++){
		if(adj[i].size()<=1){
			st=i;
			break;
		}
	}
	vector<int> res;
	vis[st]=1;
	res.push_back(st+1);
	while(res.size()<N){
		for(int x:adj[st]){
			if(vis[x]) continue;
			st=x;
			vis[st]=1;
			res.push_back(st+1);
			break;
		}
	}
	Answer(res);*/

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...