제출 #1173500

#제출 시각아이디문제언어결과실행 시간메모리
1173500Troll321Growing Vegetables is Fun 5 (JOI24_vegetables5)C++20
37 / 100
3786 ms36080 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 6e5 + 5; 
const ll MAX = 1e18;
const ll MAXBINSER = 1e9;

ll n, ntot, ans = MAX, val[MAXN], red[MAXN], blue[MAXN];

ll offIn[MAXN], offOut[MAXN], posOut[MAXN], posIn[MAXN];
unordered_map<ll,ll> occur;
void precomp() {
	vector<ll> L, R;
	for (int i = 1; i <= n; ++i) {
		L.push_back(val[i]);
	}
	for (int i = ntot; i >= n+1; --i) {
		R.push_back(val[i]);
	}

	for (int i = 1; i <= n; ++i) {
		// Leftmost yang >= val
		offIn[i] = lower_bound(R.begin(), R.end(), val[i]) - R.begin();
		offIn[i] = n-offIn[i];
	}

	for (int i = n+1; i <= ntot; ++i) {
		posIn[i] = upper_bound(L.begin()+(i-n), L.end(), val[i]) - (L.begin()+(i-n));
		// Never Zero due to Constraint
		posIn[i]++;
		offIn[i] = i-n+posIn[i]-1;
		// cout << offIn[i] << " " << posIn[i] << "|\n";

		occur[val[i]]++;

		// Rightmost yang <= val
		offOut[i] = upper_bound(L.begin(), L.end(), val[i]) - L.begin();
		offOut[i] = offOut[i]+1;
	}
}

ll diff[MAXN];
bool solve(ll x, ll arra[], ll arrb[]) {
	memset(diff, 0, sizeof(diff));

	for (ll i = 1; i <= ntot; ++i) {
		// Search Range For val[i]
		ll idl = lower_bound(arra+1, arra+1+n, val[i]-x) - arra;
		ll idr = upper_bound(arra+1, arra+1+n, val[i]+x) - arra;
		if(idl > n || idr == 1 || idl >= idr) {
			idl = -1;
			idr = 0;
		}
		idr--;

		ll idl2 = lower_bound(arrb+1, arrb+1+n, val[i]-x) - arrb;
		ll idr2 = upper_bound(arrb+1, arrb+1+n, val[i]+x) - arrb;
		if(idl2 > n || idr2 == 1 || idl2 >= idr2) {
			idl2 = -1;
			idr2 = 0;
		}
		idr2--;

		// cout << i << " " << x << "| [" << idl << "," << idr << "] [" << idl2 << "," << idr2 << "]\n";

		ll l, r;
		if (i <= n) {
			// In
			if(idl != -1) {
				l = max((ll)1, i+1-idr);
				r = min(offIn[i], i+1-idl)+1;
				diff[l]++;
				diff[r]--;
				// cout << l << " " << r << " <> ";

				if(i+1-idl > offIn[i] && abs(val[i] - arra[i+1-offIn[i]]) <= x) {
					l = offIn[i]+1;
					r = i+1;
					diff[l]++;
					diff[r]--;
				}
			}


			// Out
			if(abs(val[i]-arrb[i]) <= x) {
				l = i+1;
				r = n+1;
				diff[l]++;
				diff[r]--;
				// cout << l << " " << r << "|\n";
			}
			// // l <= offOut[i]
			// if(abs(val[i]-arrb[posOut[i]]) <= x) {
			// 	l = i+1;
			// 	r = posOut[i]+1;
			// 	diff[l]++;
			// 	diff[r]--;
			// }
			// // l > offOut[i]
			// if(idl2 != -1) {
			// 	l = max(posOut[i]+1, );
			// 	r = min(n, )+1;
			// 	diff[l]++;
			// 	diff[r]--;
			// }
		} else {
			// In
			if(abs(val[i]-arra[ntot-i+1]) <= x) {
				l = i-n+1;
				r = n+1;
				diff[l]++;
				diff[r]--;
				// cout << l << " " << r << " <> ";
			}
			
			// __/
			// l <= offIn[i]
			// if(offIn[i] != -1 && abs(val[i]-arra[posIn[i]]) <= x) {
			// 	l = i-n+1;
			// 	r = posIn[i]+1;
			// 	diff[l]++;
			// 	diff[r]--;
			// }
			// l > offIn[i]
			// if(offIn[i] < n && idl != -1) {
			// 	l = max(posIn[i]+1, idl+offIn[i]-posIn[i]);
			// 	r = min(n, idr+offIn[i]-posIn[i])+1;
			// 	diff[l]++;
			// 	diff[r]--;
			// }

			// Out
			if(idl2 != -1) {
				l = max((ll)1, idl2+i-ntot);
				r = min(offOut[i], idr2+i-ntot)+1;
				diff[l]++;
				diff[r]--;
				// cout << l << " " << r << "|\n";

				if (idr2+i-ntot > offOut[i] && abs(val[i] - arrb[offOut[i]+i-ntot]) <= x) {
					l = offOut[i]+1;
					r = i-n+1;
					diff[l]++;
					diff[r]--;
				}
			}
		}
	}

	// ------
	ll cur = 0;
	for (int i = 1; i <= ntot; ++i) {
		cur += diff[i];
		if(cur == ntot) {return true;}
	}
	return false;
}

int main() {
	cin >> n;
	ntot = 2*n;

	for (int i = 1; i <= ntot; ++i) {
		cin >> val[i];
	}

	for (int i = 1; i <= n; ++i) {
		cin >> red[i];
	}

	for (int i = 1; i <= n; ++i) {
		cin >> blue[i];
	}

	sort(red+1, red+1+n);
	sort(blue+1, blue+1+n);

	precomp();

	// for (int i = 1; i <= n; ++i) {
	// 	cout << red[i] << " ";
	// } cout << "|\n";
	// for (int i = 1; i <= n; ++i) {
	// 	cout << blue[i] << " ";
	// } cout << "|\n";

	ll l = 0, r = MAXBINSER;
	while(l <= r) {
		ll mid = (l+r) >> 1;
		// cout << "---------" << mid << "--------\n";
		if(solve(mid, red, blue) || solve(mid, blue, red)) {
			ans = mid;
			r = mid-1;
		} else {
			l = mid+1;
		}
	}
	cout << ans << "\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...