Submission #1217381

#TimeUsernameProblemLanguageResultExecution timeMemory
1217381stdfloatXylophone (JOI18_xylophone)C++20
47 / 100
24 ms428 KiB
#include <bits/stdc++.h>
#include "xylophone.h"
// #include "grader.cpp"
using namespace std;

void solve(int n) {
	int l = 1, r = n;
	while (l <= r) {
		int md = (l + r) >> 1;

		if (query(1, md) != n - 1) l = md + 1;
		else r = md - 1;
	}

	int R = l;

	vector<int> A(n + 1);
	A[R] = n;

	if (R != n) {
		A[R + 1] = A[R] - query(R, R + 1);
		for (int i = R + 2; i <= n; i++) {
			int a = A[i - 2], b = A[i - 1]; //c = A[i]
			int x = query(i - 2, i), y = query(i - 1, i);
			if (a < b) {
				if (x == y) A[i] = b - x; //c < a < b
				else if (x == b - a) A[i] = b - y; //a < c < b
				else if (x > y) A[i] = a + x; //a < b < c
				else assert(false);
			}
			else {
				if (x == y) A[i] = b + x; //c > a > b
				else if (x == a - b) A[i] = b + y; //a > c > b
				else if (x > y) A[i] = a - x; //a > b > c
				else assert(false);
			}
		}
	}
	if (1 != R) {
		A[R - 1] = A[R] - query(R - 1, R);
		for (int i = R - 2; i > 0; i--) {
			int a = A[i + 2], b = A[i + 1]; //c = A[i]
			int x = query(i, i + 2), y = query(i, i + 1);
			if (a < b) {
				if (x == y) A[i] = b - x; //b > a > c
				else if (x == b - a) A[i] = b - y; //b > c > a
				else if (x > y) A[i] = a + x; //c > b > a
				else assert(false);
			}
			else {
				if (x == y) A[i] = b + x; //b < a < c
				else if (x == a - b) A[i] = b + y; //b < c < d
				else if (x > y) A[i] = a - x; //a < b < c
				else assert(false);
			}
		}
	}

	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...