// 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |