Submission #672717

#TimeUsernameProblemLanguageResultExecution timeMemory
672717MakarooniXylophone (JOI18_xylophone)C++14
100 / 100
77 ms456 KiB
#include "xylophone.h"
#include "bits/stdc++.h"
static int A[5001];

void solve(int N){
	int l = 1, r = N;
	bool use[N + 1];
	for(int i = 1; i <= N; i++)
		use[i] = 0;
	while(r - l > 1){
		int mid = (l + r) / 2;
		if(query(1, mid) == N - 1)
			r = mid;
		else
			l = mid;
	}
	A[r] = N;
	use[N] = 1;
	int x = query(r - 1, r);
	A[r - 1] = N - x;
	use[N - x] = 1;
	if(r != N){
		x = query(r, r + 1);
		A[r + 1] = N - x;
		use[N - x] = 1;
	}
	for(int i = r - 2; i >= 1; i--){
		x = query(i, i + 1);
		if(A[i + 1] - x <= 0){
			A[i] = A[i + 1] + x;
			use[A[i + 1] + x] = 1;
			continue;
		}
		if(A[i + 1] + x > N){
			A[i] = A[i + 1] - x;
			use[A[i + 1] - x] = 1;
			continue;
		}
		if(use[A[i + 1] + x]){
			A[i] = A[i + 1] - x;
			use[A[i + 1] - x] = 1;
			continue;
		}
		if(use[A[i + 1] - x]){
			A[i] = A[i + 1] + x;
			use[A[i + 1] + x] = 1;
			continue;
		}
		int z = query(i, i + 2), y = abs(A[i + 1] - A[i + 2]);
		if(!(z == x + y)){
			if(A[i + 2] > A[i + 1]){
				A[i] = A[i + 1] + x;
				use[A[i + 1] + x] = 1;
			}
			else{
				A[i] = A[i + 1] - x;
				use[A[i + 1] - x] = 1;
			}
		}
		else{
			if(A[i + 2] > A[i + 1]){
				A[i] = A[i + 1] - x;
				use[A[i + 1] - x] = 1;
			}
			else{
				A[i] = A[i + 1] + x;
				use[A[i + 1] + x] = 1;
			}
		}
	}
	for(int i = r + 2; i <= N; i++){
		x = query(i - 1, i);
		if(A[i - 1] - x <= 0){
			A[i] = A[i - 1] + x;
			use[A[i - 1] + x] = 1;
			continue;
		}
		if(A[i - 1] + x > N){
			A[i] = A[i - 1] - x;
			use[A[i - 1] - x] = 1;
			continue;
		}
		if(use[A[i - 1] - x]){
			A[i] = A[i - 1] + x;
			use[A[i - 1] + x] = 1;
			continue;
		}
		if(use[A[i - 1] - x]){
			A[i] = A[i - 1] + x;
			use[A[i - 1] + x] = 1;
			continue;
		}
		int z = query(i - 2, i), y = abs(A[i - 1] - A[i - 2]);
		if(!(z == x + y)){
			if(A[i - 2] > A[i - 1]){
				A[i] = A[i - 1] + x;
				use[A[i - 1] + x] = 1;
			}
			else{
				A[i] = A[i - 1] - x;
				use[A[i - 1] - x] = 1;
			}
		}
		else{
			if(A[i - 2] > A[i - 1]){
				A[i] = A[i - 1] - x;
				use[A[i - 1] - x] = 1;
			}
			else{
				A[i] = A[i - 1] + x;
				use[A[i - 1] + x] = 1;
			}
		}
	}
	for(int i = 1; i <= N; i++)
		answer(i, A[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...