답안 #704330

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
704330 2023-03-02T03:47:25 Z uylulu Park (JOI17_park) C++14
20 / 100
194 ms 624 KB
#include "park.h"
#include<bits/stdc++.h>

using namespace std;

const int N = 2000;

static int adj[1400];

int n;

vector<pair<int,int>> res;

int help(int a,int b) {
	if(a > b) swap(a,b);

	return Ask(a,b,adj);
}

void sub1() {
	for(int i = 0;i < n;i++) {
		for(int j = i + 1;j < n;j++) {
			adj[i] = 1;
			adj[j] = 1;
			if(help(i,j)) {
				res.push_back({i,j});
			}
			adj[i] = 0;
			adj[j] = 0;
		}
	}
	for(auto u : res) {
		Answer(u.first,u.second);
	}
}

int kq[N + 1];

mt19937 rnd(time(0));

void process(vector<int> curr,int base) {
	kq[base] = curr[0];
	kq[base + (int)curr.size() - 1] = curr.back();

	if(curr.size() <= 3) {
		for(int i = 0;i < curr.size();i++) {
			kq[i + base] = curr[i];
		}
		return;
	}

	int idx = rnd() % ((int)curr.size() - 2);
	int val = curr[idx + 1];

	for(int i = 0;i < n;i++) {
		adj[i] = true;
	}

	vector<int> le,ri;
	le.push_back(curr[0]);
	ri.push_back(val);

	for(int i = 1;i < curr.size() - 1;i++) {
		if(curr[i] == val) continue;

		adj[curr[i]] = false;
		if(help(curr[0],val)) {
			ri.push_back(curr[i]);
		} else {
			le.push_back(curr[i]);
		}
		adj[curr[i]] = true;
	}
	le.push_back(val);
	ri.push_back(curr.back());

	process(le,base);
	process(ri,base + (int)le.size() - 1);
}

int my(int i) {
	return rnd() % i;
}

void ans(int a,int b) {
	if(a > b) swap(a,b);
	Answer(a,b);
}

void sub2() {

	vector<int> asd;
	for(int i = 1;i < n;i++) {
		asd.push_back(i);
	}
	random_shuffle(asd.begin(),asd.end(),my);

	asd.push_back(n - 1);
	reverse(asd.begin(),asd.end());
	asd.push_back(0);
	reverse(asd.begin(),asd.end());

	process(asd,0);

	for(int i = 1;i < n;i++) {

		ans(kq[i],kq[i - 1]);
	}
}

vector<int> before,after;

bool vis[N + 1];

void sub3() {
	after.push_back(0);

	while(after.size() > 0) {
		before = after;
		after.clear();

		for(auto u : before) {
			vis[u] = true;
		}
		for(auto u : before) {

			for(int i = 0;i < n;i++) {
				if(vis[i]) continue;

				adj[u] = true;
				adj[i] = true;

				if(help(u,i)) {
					res.push_back({min(u,i),max(u,i)});
					after.push_back(i);
					vis[i] = true;
				}

				adj[u] = false;
				adj[i] = false;
			}
		}
	}
	for(auto u : res) {
		ans(u.first,u.second);
	}
}

void Detect(int T, int N) {
	n = N;

	if(T == 1) {
		sub1();
		return;
	}
	if(T == 2) {
		sub2();
		return;
	}
	if(T == 3) {
		sub3();
		return;
	}
}

Compilation message

park.cpp: In function 'void process(std::vector<int>, int)':
park.cpp:46:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |   for(int i = 0;i < curr.size();i++) {
      |                 ~~^~~~~~~~~~~~~
park.cpp:63:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |  for(int i = 1;i < curr.size() - 1;i++) {
      |                ~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 9 ms 340 KB Output is correct
3 Correct 13 ms 348 KB Output is correct
4 Correct 7 ms 340 KB Output is correct
5 Correct 10 ms 360 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 186 ms 512 KB Output is correct
2 Correct 108 ms 624 KB Output is correct
3 Correct 88 ms 508 KB Output is correct
4 Correct 194 ms 524 KB Output is correct
5 Correct 191 ms 616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 384 KB Wrong Answer[5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Wrong Answer[6]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Wrong Answer[6]
2 Halted 0 ms 0 KB -