제출 #654528

#제출 시각아이디문제언어결과실행 시간메모리
654528CDuongXylophone (JOI18_xylophone)C++14
100 / 100
69 ms444 KiB
#include<bits/stdc++.h>
#include "xylophone.h"

using namespace std;
int a[5005], res[5005];

void solve(int n) {
	memset(a, 0, sizeof(a));
	int l = 1, r = n;
	
	while(l <= r) {
		int mid = (l + r) >> 1;
		int tmp = query(mid, n);
		if(tmp != n - 1) r = mid - 1;
		else l = mid + 1;
	}
	//cout << l << " " << r << endl;
	swap(l, r);
	res[l] = 1;
	a[1] = 1;
	if(l > 1) {
		res[l - 1] = 1 + query(l - 1, l);
		a[res[l - 1]] = 1;
		for(int i = l - 2; i >= 1; --i) {
			int tmp = query(i, i + 1);
			if(res[i + 1] + tmp > n || a[res[i + 1] + tmp]) {
				res[i] = res[i + 1] - tmp;
				a[res[i]] = 1;
				continue;
			}
			if(res[i + 1] - tmp < 1 || a[res[i + 1] - tmp]) {
				res[i] = res[i + 1] + tmp;
				a[res[i]] = 1;
				continue;
			}
			int tmp2 = query(i, i + 2);
			if(tmp2 == tmp || tmp2 == abs(res[i + 1] - res[i + 2])) {
				if(res[i + 1] < res[i + 2]) res[i] = res[i + 1] + tmp;
				else res[i] = res[i + 1] - tmp;
			}
			else {
				if(res[i + 1] < res[i + 2]) res[i] = res[i + 1] - tmp;
				else res[i] = res[i + 1] + tmp;
			}
			a[res[i]] = 1;
		}
	}
	if(l < n) {
		res[l + 1] = 1 + query(l, l + 1);
		a[res[l + 1]] = 1;
		for(int i = l + 2; i <= n; ++i) {
			int tmp = query(i - 1, i);
			if(res[i - 1] + tmp > n || a[res[i - 1] + tmp]) {
				res[i] = res[i - 1] - tmp;
				a[res[i]] = 1;
				continue;
			}
			if(res[i - 1] - tmp < 1 || a[res[i - 1] - tmp]) {
				res[i] = res[i - 1] + tmp;
				a[res[i]] = 1;
				continue;
			}
			int tmp2 = query(i - 2, i);
			if(tmp2 == tmp || tmp2 == abs(res[i - 1] - res[i - 2])) {
				if(res[i - 1] < res[i - 2]) res[i] = res[i - 1] + tmp;
				else res[i] = res[i - 1] - tmp;
			}
			else {
				if(res[i - 1] < res[i - 2]) res[i] = res[i - 1] - tmp;
				else res[i] = res[i - 1] + tmp;
			}
			a[res[i]] = 1;
		}
	}
	//for(int i = 1; i <= n; ++i) cout << i << " " << res[i] << endl;
	for(int i = 1; i <= n; ++i) answer(i, res[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...