Submission #1368821

#TimeUsernameProblemLanguageResultExecution timeMemory
1368821gelastropodGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
100 / 100
1276 ms29568 KiB
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long

int N;
vector<int> A, B, C, negA, negB, negC, sums, a, b;
int idx1, idx2, idx3, idx4, crnt, K;

int clamp(int a, int b, int c) {
	return min(max(c, a), b);
}

void process() {
	while (idx3 >= 0 && b[idx3] >= a[crnt] - K) idx3--;
	while (idx4 >= 0 && b[idx4] > a[crnt] + K) idx4--;
	if (crnt == idx1) {
		int ub = (idx3 < N + idx1 - idx2 - 1 ? 3 * N : idx1 - idx3 - 1);
		int lb = (idx4 < N + idx1 - idx2 - 1 ? 3 * N : idx1 - idx4);
		ub = clamp(0, idx1, ub), lb = clamp(1, idx1 + 1, lb);
		sums[lb]++, sums[ub + 1]--;
	}
	else {
		int lb = (idx3 < N + idx1 - idx2 - 1 ? -1 : idx2 + idx3 - N + 2);
		int ub = (idx4 < N + idx1 - idx2 - 1 ? -1 : idx2 + idx4 - N + 1);
		lb = clamp(idx2 - N + 1, N + 1, lb), ub = clamp(idx2 - N, N, ub);
		sums[lb]++, sums[ub + 1]--;
	}
}

bitset<300005> calc() {
	fill(sums.begin(), sums.end(), 0);
	idx1 = N, idx2 = N, idx3 = N - 1, idx4 = N - 1, crnt = N;
	if (idx3 < N - 1 && idx4 >= N - 1) sums[1]++, sums[N + 1]--;
	while (idx1 >= 1 && idx2 < 2 * N - 1) {
		process();
		if (a[idx1 - 1] > a[idx2 + 1]) crnt = --idx1;
		else crnt = ++idx2;
	}
	while (idx1 >= 1) {
		process();
		crnt = --idx1;
	}
	while (idx2 < 2 * N - 1) {
		process();
		crnt = ++idx2;
	}
	process();
	for (int i = 1; i < sums.size(); i++) sums[i] += sums[i - 1];
	bitset<300005> res = 0;
	for (int i = 1; i <= N; i++) res[i] = (sums[i] == N);
	return res;
}

bool poss() {
	a = A, b = B; auto red1 = calc();
	b = C; auto blue1 = calc();
	a = negA, b = negB; auto red2 = calc();
	b = negC; auto blue2 = calc();
	for (int i = 1; i <= N; i++) if ((red1[i] && blue2[i]) || (red2[i] && blue1[i])) return true;
	return false;
}

signed main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int a; cin >> N;
	sums.resize(N + 5, 0);
	negA.resize(2 * N, 0);
	for (int i = 0; i < 2 * N; i++) {
		cin >> a;
		A.push_back(a);
		negA[(i + N) % (2 * N)] = -a;
	}
	for (int i = 0; i < N; i++) {
		cin >> a;
		B.push_back(a);
		negB.push_back(-a);
	}
	for (int i = 0; i < N; i++) {
		cin >> a;
		C.push_back(a);
		negC.push_back(-a);
	}
	sort(B.begin(), B.end());
	sort(negB.begin(), negB.end());
	sort(C.begin(), C.end());
	sort(negC.begin(), negC.end());
	int low = 0, high = 1000000000, ans = -1;
	while (low <= high) {
		K = (low + high) / 2;
		if (poss()) high = K - 1, ans = K;
		else low = K + 1;
	}
	cout << ans << '\n';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...