Submission #21024

#TimeUsernameProblemLanguageResultExecution timeMemory
21024model_codePark (JOI17_park)C++11
100 / 100
513 ms1792 KiB
#include <stdio.h>
#include "park.h"

static int Place[9999];
static int checked[9999]; //0:not 1:checked 2:in_stack
static int edges[9999][9];
static int degree[9999];
static int N;
static int myAsk(int A,int B) {
	if(A>B) return myAsk(B,A);
	return Ask(A,B,Place);
}
static void myAnswer(int A,int B) {
	if(A>B) {
		Answer(B,A);
	} else {
		Answer(A,B);
	}
	edges[A][degree[A]++]=B;
	edges[B][degree[B]++]=A;
}
static int direct_connection(int now) {
	int i;
	for(i=0;i<N;i++) {
		Place[i]=0;
		if(checked[i]==1) Place[i]=1;
	}
	Place[now]=1;
	return myAsk(0,now);
}
static int find_new_node(int now) {
	int i;
	int minv=0; int maxv=N-1;
	while(minv<maxv) {
		int hf=(minv+maxv)/2;
		for(i=0;i<N;i++) Place[i]=0;
		for(i=0;i<=hf;i++) if(checked[i]!=2) Place[i]=1;
		for(i=hf+1;i<N;i++) if(checked[i]==1) Place[i]=1;
		Place[now]=1;
		if(myAsk(0,now)) {
			maxv=hf;
		} else {
			minv=hf+1;
		}
	}
	return minv;
}
static int rem[9999];
static int dfs_order_size;
static int dfs_order[9999];
static int dfs_order_checked[9999];
static void dfs_order_calc(int now) {
	dfs_order_checked[now]=1;
	dfs_order[dfs_order_size++]=now;
	int i;
	for(i=0;i<degree[now];i++) if(rem[edges[now][i]]==1&&dfs_order_checked[edges[now][i]]==0) dfs_order_calc(edges[now][i]);
}
static void dfs_delete(int now) {
	rem[now]=0;
	Place[now]=0;
	int i;
	for(i=0;i<degree[now];i++) if(rem[edges[now][i]]==1) dfs_delete(edges[now][i]);
}
static void find_edges(int now) {
	int cur,i;
	for(i=0;i<N;i++) rem[i]=0;
	for(i=0;i<N;i++) if(checked[i]==1) rem[i]=1;
	for(cur=0;cur<N;cur++) {
		while(rem[cur]) {
			for(i=0;i<N;i++) Place[i]=rem[i];
			Place[now]=1;
			if(myAsk(cur,now)) {
				dfs_order_size=0;
				for(i=0;i<N;i++) dfs_order_checked[i]=0;
				dfs_order_calc(cur);
				int minv=0; int maxv=dfs_order_size-1;
				while(minv<maxv) {
					int hf=(minv+maxv)/2;
					for(i=0;i<=hf;i++) Place[dfs_order[i]]=1;
					for(i=hf+1;i<dfs_order_size;i++) Place[dfs_order[i]]=0;
					if(myAsk(cur,now)==0) {
						minv=hf+1;
					} else {
						maxv=hf;
					}
				}
				myAnswer(now,dfs_order[minv]);
				rem[dfs_order[minv]]=0;
				Place[dfs_order[minv]]=0;
			} else {
				dfs_delete(cur);
			}
		}
	}
}
static void execute(int now) {
	checked[now]=2;
	while(direct_connection(now)==0) {
		int next=find_new_node(now);
		execute(next);
	}
	find_edges(now);
	checked[now]=1;
}
void Detect(int T,int N_get) {
	N=N_get;
	int i;
	checked[0]=1;
	for(i=1;i<N;i++) if(checked[i]==0) execute(i);
}

Compilation message (stderr)


#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...