답안 #125320

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
125320 2019-07-05T05:41:49 Z 김현수(#3338) Park (JOI17_park) C++14
100 / 100
303 ms 876 KB
#include<bits/stdc++.h>
#include "park.h"
using namespace std;

namespace {
	const int N = 1505;
	int place[N];
	bool vis[N], blk[N];

	int n;
	vector<int> tree[N];
}

int check (int S, int E, vector<int> &O) {
	for(int i=0;i<n;i++) place[i] = 0;
	for(auto &T : O) place[T] = 1;
	place[S] = 1;
	place[E] = 1;
	return Ask(min(S, E), max(S, E), place);
}

int Find (int A, int B, vector<int> &O) {
	int S = 0, E = O.size();
	while(S<E) {
		int M = (S+E)/2;
		vector<int> V;
		for(int i=0;i<M;i++) {
			V.push_back(O[i]);
		}
		check(A, B, V) ? E = M : S = M+1;
	}
	return (S ? O[S-1] : A);
}

void preorder (int C, int P, vector<int> &O) {
	O.push_back(C);
	for(auto &T: tree[C]) {
		if(T == P || blk[T]) continue;
		preorder(T, C, O);
	}
}

void construct (int S, int E, vector<int> &O) {
	vis[S] = true;
	vis[E] = true;
	int M = Find(S, E, O);
	if(M == S) {
		tree[S].push_back(E);
		tree[E].push_back(S);
		Answer(min(S, E), max(S, E));
	}
	else {
		construct(S, M, O);
		construct(M, E, O);
	}
}

void Try (int P, int I) {
	vector<int> V;
	preorder(I, -1, V);
	if(!check(I, P, V)) return;
	int J = Find(I, P, V);
	Answer(min(P, J), max(P, J));
	blk[J] = true;
	for(auto &T : tree[J]) {
		if(!blk[T]) Try(P, T);
	}
}

void Detect (int T, int N) {
	n = N;
	for(int i=1;i<n;i++) {
		if(vis[i]) continue;
		vector<int> V;
		for(int j=1;j<n;j++) {
			if(tree[j].empty()) V.push_back(j);
		}
		preorder(0, -1, V);
		int M = Find(0, i, V);
		if(tree[M].empty()) M = 0;
		V.clear();
		for(int j=1;j<n;j++) {
			if(tree[j].empty()) V.push_back(j);
		}
		construct(M, i, V);
	}
	vector<int> X;
	preorder(0, -1, X);
	for(int i=(int)X.size()-1;i>0;i--) {
		for(int j=0;j<X.size();j++) {
			blk[X[j]] = (j >= i);
		}
		int I;
		for(auto &T : tree[X[i]]) {
			if(!blk[T]) {
				I = T;
				break;
			}
		}
		blk[I] = true;
		for(auto &T : tree[I]) {
			if(!blk[T]) Try(X[i], T);
		}
	}
}

Compilation message

park.cpp: In function 'void Detect(int, int)':
park.cpp:90:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0;j<X.size();j++) {
               ~^~~~~~~~~
park.cpp:93:7: warning: 'I' may be used uninitialized in this function [-Wmaybe-uninitialized]
   int I;
       ^
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 11 ms 376 KB Output is correct
3 Correct 10 ms 376 KB Output is correct
4 Correct 18 ms 376 KB Output is correct
5 Correct 30 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 141 ms 580 KB Output is correct
2 Correct 303 ms 684 KB Output is correct
3 Correct 237 ms 832 KB Output is correct
4 Correct 150 ms 604 KB Output is correct
5 Correct 149 ms 576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 237 ms 504 KB Output is correct
2 Correct 254 ms 580 KB Output is correct
3 Correct 258 ms 760 KB Output is correct
4 Correct 259 ms 504 KB Output is correct
5 Correct 252 ms 648 KB Output is correct
6 Correct 245 ms 632 KB Output is correct
7 Correct 252 ms 504 KB Output is correct
8 Correct 257 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 116 ms 532 KB Output is correct
2 Correct 242 ms 604 KB Output is correct
3 Correct 240 ms 604 KB Output is correct
4 Correct 190 ms 504 KB Output is correct
5 Correct 228 ms 632 KB Output is correct
6 Correct 199 ms 760 KB Output is correct
7 Correct 163 ms 876 KB Output is correct
8 Correct 231 ms 632 KB Output is correct
9 Correct 205 ms 784 KB Output is correct
10 Correct 239 ms 756 KB Output is correct
11 Correct 251 ms 504 KB Output is correct
12 Correct 248 ms 588 KB Output is correct
13 Correct 171 ms 632 KB Output is correct
14 Correct 254 ms 584 KB Output is correct
15 Correct 165 ms 636 KB Output is correct
16 Correct 259 ms 760 KB Output is correct
17 Correct 163 ms 632 KB Output is correct
18 Correct 240 ms 620 KB Output is correct
19 Correct 173 ms 760 KB Output is correct
20 Correct 221 ms 592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 274 ms 760 KB Output is correct
2 Correct 274 ms 708 KB Output is correct
3 Correct 263 ms 504 KB Output is correct
4 Correct 245 ms 636 KB Output is correct
5 Correct 303 ms 760 KB Output is correct
6 Correct 170 ms 656 KB Output is correct
7 Correct 232 ms 644 KB Output is correct
8 Correct 230 ms 552 KB Output is correct
9 Correct 241 ms 632 KB Output is correct
10 Correct 234 ms 632 KB Output is correct
11 Correct 212 ms 536 KB Output is correct
12 Correct 204 ms 636 KB Output is correct
13 Correct 232 ms 680 KB Output is correct
14 Correct 276 ms 504 KB Output is correct
15 Correct 243 ms 732 KB Output is correct
16 Correct 251 ms 504 KB Output is correct
17 Correct 164 ms 632 KB Output is correct
18 Correct 236 ms 828 KB Output is correct