제출 #1153650

#제출 시각아이디문제언어결과실행 시간메모리
1153650AmirAli_H1Sparklers (JOI17_sparklers)C++20
100 / 100
45 ms5824 KiB
// In the name of Allah

#include <bits/stdc++.h>
using namespace std;

typedef		long long int			ll;
typedef		long double				ld;
typedef		pair<int, int>			pii;
typedef		pair<ll, ll>			pll;
typedef		complex<ld>				cld;

#define		all(x)					(x).begin(),(x).end()
#define		len(x)					((ll) (x).size())
#define		F						first
#define		S						second
#define		pb						push_back
#define		sep						' '
#define		endl					'\n'
#define		Mp						make_pair
#define		kill(x)					cout << x << '\n', exit(0)
#define		set_dec(x)				cout << fixed << setprecision(x);
#define		file_io(x,y)			freopen(x, "r", stdin); freopen(y, "w", stdout);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int maxn = 1e6 + 4;

int n, k; ll t;
ll A[maxn]; vector<ll> ls1, ls2;
ll sm1[maxn], sm2[maxn];
int R1[maxn], R2[maxn]; ll M1[maxn], M2[maxn];
ll mn1[maxn], mn2[maxn], mx1[maxn], mx2[maxn];

bool ok(ll x) {
	ll tx = (t * x);
	if (tx >= A[n - 1]) return 1;

	ls1.clear(); int n1 = k + 1;
	for (int i = k; i >= 0; i--) {
		if (i == k) ls1.pb(0);
		else ls1.pb(tx - (A[i + 1] - A[i]));
	}
	for (int i = 0; i < n1; i++) {
		if (i == 0) sm1[i] = ls1[i];
		else sm1[i] = sm1[i - 1] + ls1[i];
	}
	for (int i = n1 - 1; i >= 0; i--) {
		if (i == n1 - 1) {
			mn1[i] = mx1[i] = sm1[i];
		}
		else {
			mn1[i] = min(mn1[i + 1], sm1[i]);
			mx1[i] = max(mx1[i + 1], sm1[i]);
		}
	}
	for (int i = n1 - 1; i >= 0; i--) {
		R1[i] = i + 1; M1[i] = sm1[i];
		while (R1[i] != n1) {
			if (sm1[R1[i]] >= sm1[i]) break;
			M1[i] = min(M1[i], M1[R1[i]]);
			R1[i] = R1[R1[i]];
		}
	}

	ls2.clear(); int n2 = n - k;
	for (int i = k; i < n; i++) {
		if (i == k) ls2.pb(0);
		else ls2.pb(tx - (A[i] - A[i - 1]));
	}
	for (int i = 0; i < n2; i++) {
		if (i == 0) sm2[i] = ls2[i];
		else sm2[i] = sm2[i - 1] + ls2[i];
	}
	for (int i = n2 - 1; i >= 0; i--) {
		if (i == n2 - 1) {
			mn2[i] = mx2[i] = sm2[i];
		}
		else {
			mn2[i] = min(mn2[i + 1], sm2[i]);
			mx2[i] = max(mx2[i + 1], sm2[i]);
		}
	}
	for (int i = n2 - 1; i >= 0; i--) {
		R2[i] = i + 1; M2[i] = sm2[i];
		while (R2[i] != n2) {
			if (sm2[R2[i]] >= sm2[i]) break;
			M2[i] = min(M2[i], M2[R2[i]]);
			R2[i] = R2[R2[i]];
		}
	}

	int i1 = 0, i2 = 0;
	while (i1 < n1 - 1 || i2 < n2 - 1) {
		if (mn1[i1] + mx2[i2] < 0 || mx1[i1] + mn2[i2] < 0) return 0;
		if (i1 == n1 - 1) {
			if (sm1[i1] + sm2[i2 + 1] >= 0) {
				i2++; continue;
			}
			else return 0;
		}
		else if (i2 == n2 - 1) {
			if (sm1[i1 + 1] + sm2[i2] >= 0) {
				i1++; continue;
			}
			else return 0;
		}
		if (R1[i1] != n1) {
			if (M1[i1] + sm2[i2] >= 0) {
				i1 = R1[i1]; continue;
			}
		}
		if (R2[i2] != n2) {
			if (sm1[i1] + M2[i2] >= 0) {
				i2 = R2[i2]; continue;
			}
		}
		if (R1[i1] != n1 || R2[i2] != n2) return 0;
		if (mn1[i1] + mx2[i2 + 1] >= 0) {
			i2++; int x = mx2[i2];
			while (sm2[i2] != x) i2++;
			continue;
		}
		if (mx1[i1 + 1] + mn2[i2] >= 0) {
			i1++; int x = mx1[i1];
			while (sm1[i1] != x) i1++;
			continue;
		}
		return 0;
	}
	return (i1 == n1 - 1 && i2 == n2 - 1);
}

void solve() {
	cin >> n >> k >> t; k--; t *= 2;
	for (int i = 0; i < n; i++) {
		cin >> A[i];
	}

	ll l = -1, r = (A[n - 1] / t) + 2;
	while (r - l > 1) {
		ll mid = (l + r) / 2;
		if (ok(mid)) r = mid;
		else l = mid;
	}
	cout << r << endl;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	int T = 1;
	while (T--) {
		solve();
	}
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...