제출 #1340832

#제출 시각아이디문제언어결과실행 시간메모리
1340832jenterjongle45도서관 (JOI18_library)C++20
0 / 100
40 ms448 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);
	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));
	for(int i=0;i<N;i++){
		if(adj[i].size()==2||((i==st[0]||i==st[1])&&!adj[i].empty())) continue;
		F(0,N-1,i);
	}
	int now=st[0],p=-1;
	while(ret.size()<N){
		ret.push_back(now+1);
		for(int x:adj[now]){
			if(x==p) continue;
			p=now;
			now=x;
			break;
		}
	}
	// for(int i=0;i<N;i++){
	// 	cout<<i<<'\n';
	// 	for(int x:adj[i]) cout<<x<<' ';
	// 	cout<<'\n';
	// }
	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...