Submission #1327882

#TimeUsernameProblemLanguageResultExecution timeMemory
1327882PieArmyPark (JOI17_park)C++20
67 / 100
213 ms728 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
#include "park.h"
mt19937 rng(chrono::high_resolution_clock().now().time_since_epoch().count());
int rint(int a,int b){
	int ans=0;
	ans=a+(rng()%(b-a+1));
	return ans;
}

int n;
static int arr[1400];
vector<int>source;
vector<int>komsu[1400];
int var[1400],dep[1400];

set<pair<int,int>>soruldu;

void answer(int x,int y){
	if(x>y)swap(x,y);
	if(soruldu.count({x,y}))return;
	soruldu.insert({x,y});
	komsu[x].pb(y);
	komsu[y].pb(x);
	Answer(x,y);
}

bool ask(int x,int y){
	if(x>y)swap(x,y);
	if(x==y)return true;
	return Ask(x,y,arr);
}

void spread_love(){
	for(int x:source){
		dep[x]=0;
	}
	source.clear();
	queue<int>q;
	dep[0]=1;
	q.push(0);
	while(q.size()){
		int pos=q.front();
		source.pb(pos);
		q.pop();
		for(int x:komsu[pos]){
			if(dep[x])continue;
			dep[x]=dep[pos]+1;
			q.push(x);
		}
	}
}

void if_you_are_in_source_raise_your_hand(int x=-1){
	if(x==-1)x=source.size()-1;
	for(int i=0;i<=x;i++){
		arr[source[i]]=1;
	}
}

void kill_all(){
	for(int i=0;i<n;i++){
		arr[i]=0;
	}
}

void f(int pos){
	kill_all();
	if_you_are_in_source_raise_your_hand();
	arr[pos]=1;
	if(ask(0,pos)){
		spread_love();
		int l=0,r=source.size()-1;
		while(l<r){
			int mi=(l+r)/2;
			kill_all();
			if_you_are_in_source_raise_your_hand(mi);
			arr[pos]=1;
			if(ask(0,pos))r=mi;
			else l=mi+1;
		}
		answer(pos,source[l]);
		var[pos]=1;
		source.pb(pos);
		return;
	}
	while(true){
		vector<int>v;
		for(int i=0;i<n;i++){
			if(var[i])continue;
			if(i==pos)continue;
			v.pb(i);
		}
		int l=0,r=v.size()-1;
		while(l<r){
			int mi=(l+r)/2;
			kill_all();
			if_you_are_in_source_raise_your_hand();
			arr[pos]=1;
			for(int i=0;i<=mi;i++){
				arr[v[i]]=1;
			}
			if(ask(0,pos))r=mi;
			else l=mi+1;
		}
		f(v[l]);
		kill_all();
		arr[pos]=arr[v[l]]=1;
		if(ask(pos,v[l])){
			answer(pos,v[l]);
			var[pos]=1;
			source.pb(pos);
			break;
		}
	}
}

void Detect(int T, int N) {
	n=N;
	source={0};
	var[0]=1;
	for(int i=1;i<n;i++){
		if(var[i])continue;
		f(i);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...