Submission #1324065

#TimeUsernameProblemLanguageResultExecution timeMemory
1324065duckindogXylophone (JOI18_xylophone)C++20
47 / 100
27 ms436 KiB
#include <bits/stdc++.h>
#include "xylophone.h"

using namespace std;

static int A[5000];
int get(int i) { return A[i - 1]; }
void Answer(int i, int x) { 
	A[i - 1] = x;
	answer(i, x); 
}

void solve(int N) {
	int posN = -1;
	{ // binsearch posN
		int le = 1, ri = N;
		while (le <= ri) { 
			int mid = (le + ri) >> 1;
			if (query(1, mid) == N - 1) ri = mid - 1, posN = mid;
			else le = mid + 1;
		}
	}
	assert(posN != -1);
	
	Answer(posN, N);
	{ // posN + 1 to N;
		for (int i = posN + 1; i <= N; ++i) { 
			int value = query(i - 1, i);
			if (i == posN + 1) { 
				Answer(i, N - value);
				continue;
			}

			int x = get(i - 2), y = get(i - 1);
			
			if (y + value > N || y - value < 1) { 
				if (y + value > N) Answer(i, y - value);
				else Answer(i, y + value);
				continue;
			}

			int value2 = query(i - 2, i);
			for (const auto& z : {y - value, y + value}) { 
				int max2 = max({x, y, z}), min2 = min({x, y, z});
				if (max2 - min2 == value2) { 
					Answer(i, z);
					break;
				}
			}
		}
	}
	{ // posN - 1 to 1
		for (int i = posN - 1; i >= 1; --i) { 
			int value = query(i, i + 1);
			if (i == posN - 1) { 
				Answer(i, N - value);
				continue;
			}

			int x = get(i + 2), y = get(i + 1);
			if (y + value > N || y - value < 1) { 
				if (y + value > N) Answer(i, y - value);
				else Answer(i, y + value);
				continue;
			}

			int value2 = query(i, i + 2);
			for (const auto& z : {y - value, y + value}) { 
				int max2 = max({x, y, z}), min2 = min({x, y, z});
				if (max2 - min2 == value2) { 
					Answer(i, z);
					break;
				}
			}
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...