답안 #320650

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
320650 2020-11-09T11:54:07 Z arnold518 Park (JOI17_park) C++14
0 / 100
426 ms 1236 KB
#include "park.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1500;

int T, N;
int P[MAXN+10];

int query(int A, int B)
{
	if(A>B) swap(A, B);
	//printf("QUERY %d %d\n", A, B);
	//for(int i=0; i<N; i++) printf("%d ", P[i]); printf("\n");
	return Ask(A, B, P);	
}

void answer(int A, int B)
{
	if(A>B) swap(A, B);
	//printf("ANSWER %d %d\n", A, B);
	Answer(A, B);
}

bool vis[MAXN+10];
int D[MAXN+10];

void solve(int u, int v)
{
	//printf("SOLVE %d %d\n", u, v);
	if(vis[u] && vis[v]) return;

	vector<int> V;
	for(int i=0; i<N; i++)
	{
		if(i==u) continue;
		if(i==v) continue;
		V.push_back(i);
	}

	for(int i=0; i<N; i++) P[i]=1;

	int lo=-1, hi=V.size();
	while(lo+1<hi)
	{
		int mid=lo+hi>>1;
		for(int j=0; j<=mid; j++) P[V[j]]=0;
		if(query(u, v)) lo=mid;
		else hi=mid;
		for(int j=0; j<=mid; j++) P[V[j]]=1;
	}

	for(int i=0; i<N; i++) P[i]=0;

	if(hi==V.size())
	{
		vis[v]=1;
		D[v]=D[u]+1;
		answer(u, v);
		return;
	}

	int w=V[hi];

	solve(u, w);
	solve(w, v);
}

void Detect(int _T, int _N)
{
	T=_T; N=_N;

	int cnt=1;
	vis[0]=1;

	for(int i=1; i<N; i++)
	{
		if(vis[i]) continue;

		P[0]=1;
		P[i]=1;
		if(query(0, i))
		{
			P[0]=0;
			vector<int> V;
			for(int i=0; i<N; i++) if(vis[i]) V.push_back(i);
			sort(V.begin(), V.end(), [&](const int &p, const int &q) { return D[p]<D[q]; });

			int lo=-1, hi=V.size()-1;
			while(lo+1<hi)
			{
				int mid=lo+hi>>1;
				for(int j=0; j<=mid; j++) P[V[j]]=1;
				if(query(0, i)) hi=mid;
				else lo=mid;
				for(int j=0; j<=mid; j++) P[V[j]]=0;
			}
			answer(V[hi], i);
			D[i]=D[V[hi]]+1;
			vis[i]=true;
			P[i]=0;
		}
		else
		{
			P[0]=0;
			P[i]=0;
			solve(0, i);
		}
	}
}

Compilation message

park.cpp: In function 'void solve(int, int)':
park.cpp:50:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   50 |   int mid=lo+hi>>1;
      |           ~~^~~
park.cpp:59:7: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |  if(hi==V.size())
      |     ~~^~~~~~~~~~
park.cpp: In function 'void Detect(int, int)':
park.cpp:96:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   96 |     int mid=lo+hi>>1;
      |             ~~^~~
park.cpp:77:6: warning: unused variable 'cnt' [-Wunused-variable]
   77 |  int cnt=1;
      |      ^~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Wrong Answer[6]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 231 ms 680 KB Output is correct
2 Incorrect 260 ms 1236 KB Wrong Answer[5]
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 327 ms 612 KB Output is correct
2 Correct 370 ms 492 KB Output is correct
3 Correct 348 ms 612 KB Output is correct
4 Incorrect 383 ms 492 KB Wrong Answer[5]
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 484 KB Output is correct
2 Incorrect 352 ms 564 KB Wrong Answer[5]
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 426 ms 612 KB Wrong Answer[5]
2 Halted 0 ms 0 KB -