답안 #320642

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
320642 2020-11-09T11:28:30 Z arnold518 Park (JOI17_park) C++14
0 / 100
2 ms 640 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)
{
	//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);
	Answer(A, B);
}

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

void solve(int u, int v)
{
	if(vis[u] && vis[v]) return;

	P[u]=1; P[v]=1;
	if(query(u, v))
	{
		vis[v]=1;
		D[v]=D[u]+1;
		answer(u, 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()-1;
	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;
	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:56:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   56 |   int mid=lo+hi>>1;
      |           ~~^~~
park.cpp: In function 'void Detect(int, int)':
park.cpp:93:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   93 |     int mid=lo+hi>>1;
      |             ~~^~~
park.cpp:74:6: warning: unused variable 'cnt' [-Wunused-variable]
   74 |  int cnt=1;
      |      ^~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Wrong Answer[4]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 492 KB Wrong Answer[4]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 492 KB Wrong Answer[4]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Wrong Answer[4]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 640 KB Wrong Answer[4]
2 Halted 0 ms 0 KB -