제출 #54737

#제출 시각아이디문제언어결과실행 시간메모리
54737ksun48Park (JOI17_park)C++14
20 / 100
697 ms1280 KiB
#include <bits/stdc++.h>
#include "park.h"
using namespace std;

int P[1400];
int ask(int a, int b){
	if(P[a] == 0 || P[b] == 0) return 0;
	if(a == b) return 1;
	return Ask(min(a,b), max(a,b), P);
}
void solve1(int n){
	for(int i = 0; i < n; i++){
		for(int j = i+1; j < n; j++){
			P[i] = P[j] = 1;
			if(ask(i,j)){
				Answer(i, j);
			}
			P[i] = P[j] = 0;
		}
	}
}
void solvetree(vector<int> v, int n){
	if(v.size() <= 1) return;
	while(1){
		int a = v[rand() % v.size()];
		int b = v[rand() % v.size()];
		if(a >= b) continue;
		for(int i = 0; i < n; i++){
			P[i] = 0;
		}
		P[a] = P[b] = 1;
		if(!ask(a,b)){
			continue;
		}
		Answer(a,b);
		vector<int> v1;
		vector<int> v2;
		for(int i = 0; i < n; i++){
			P[i] = 0;
		}
		for(int x : v){
			P[x] = 1;
		}
		P[b] = 0;
		for(int x : v){
			if(ask(a, x)){
				v1.push_back(x);
			} else {
				v2.push_back(x);
			}
		}
		solvetree(v1, n);
		solvetree(v2, n);
		return;
	}
}
void solve2(int n){
	vector<int> v;
	for(int i = 0; i < n; i++){
		v.push_back(i);
	}
	solvetree(v, n);
}
void Detect(int T, int N) {
	srand(48);
	for(int i = 0; i < N; i++){
		P[i] = 0;
	}
	if(T == 1){
		solve1(N);
	} else if(T >= 2){
		solve2(N);
	}
}
#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...