// f[i] 1-i 之间的数字选第 i 个最大收获
// f[i] = max(f[j]) + a[i] , 单调队列
// i-R <= j <=i-L
// res = max(f[i]) i 属于 n-R+1 到 n 之间
//m 长度能满足要求
//m + 1 长度能不能满足要求
//
//设最长段为 m, 连续的 m + 1 个必须选择一个
//f[i] 在 1 - i 之间,选第 i 个的合法方案的最短时间
//f[i] = min(f[j]) + a[i] , i-m <= j <= i-1
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, t, a[N], f[N], q[N];
bool check(int x) {
int hh = 0, tt = -1;
for (int i = 1; i <= n; i++) {
while (hh <= tt && f[q[tt]] >= f[i - 1])
tt--;
q[++tt] = i - 1;
if (hh <= tt && q[hh] < i - x)
hh++;
f[i] = f[q[hh]] + a[i];
if (i > n - x && f[i] <= t)
return 1;
}
return 0;
}
int main() {
cin >> n >> t;
for (int i = 1; i <= n; i++)
cin >> a[i];
int l = -1, r = n + 1, ans;
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid))
ans = mid, r = mid - 1;
else
l = mid + 1;
}
cout << ans - 1;
return 0;
}
// 不能超过连续的K个, k+1 个里面一定有一个不选
// 不选的里面的效率最低,求出这个值
// 总的 - 不选的最低效率
// f[i] 表示 1- i的奶牛中,选择第i 个的最小效率
// f[i] = min(f[j]) + w[i] , i - (k+1) <= j <= i-1
// i -j + 1 >= k+2 , i 到 j 之间加上 i ,最多只能有 k+1
// min(f[j]) 求一段区间内的最小值,滑动窗口
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, k, q[N];
long long a[N], f[N], sum;
int main() {
cin >> n >> k;
k++;
for (int i = 1; i <= n; i++)
cin >> a[i], sum += a[i];
int hh = 0, tt = -1;
long long ans = 1e18;
for (int i = 1; i <= n; i++) {
while (hh <= tt && f[q[tt]] >= f[i - 1])
tt--;
q[++tt] = i - 1;
if (hh <= tt && q[hh] < i - k)
hh++;
f[i] = f[q[hh]] + a[i];
if (i > n - k)
ans = min(ans, f[i]);
}
cout << sum - ans;
return 0;
}
cout << 0 << endl;
for (int i = 1; i < n; i++) {
while (hh <= tt && a[q[tt]] >= a[i])
tt--;
q[++tt] = i;
if (hh <= tt && i - q[hh] >= m)
hh++;
cout << a[q[hh]] << endl;
}
//下标 1 2 3 4 5 6 7 8
//值 1 3 -1 -3 5 3 6 7
//k =3 带进来
//单调队列:最小值: 3 6 7
// -1 -3 -3 -3 3 3
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, k;
int a[N], q[N];
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> a[i];
// 单调队列求最小值
int hh = 0, tt = -1;
for (int i = 0; i < n; i++) {
// 当前入队的值是 a[i], 检查队列里面,是否有不如 a[i]的
// 1 -1
while (hh <= tt && a[q[tt]] >= a[i])
tt--;
q[++tt] = i;
// 检查头, 要保证在区间长度 k 里
// i - q[hh]+1 > k
if (hh <= tt && i - k + 1 > q[hh])
hh++;
if (i >= k - 1)
cout << a[q[hh]] << " ";
}
puts("");
// 单调队列求最大值
hh = 0, tt = -1;
for (int i = 0; i < n; i++) {
// 当前入队的值是 a[i], 检查队列里面,是否有不如 a[i]的
// 1 -1
while (hh <= tt && a[q[tt]] <= a[i])
tt--;
q[++tt] = i;
// 检查头, 要保证在区间长度 k 里
// i - q[hh]+1 > k
if (hh <= tt && i - k + 1 > q[hh])
hh++;
if (i >= k - 1)
cout << a[q[hh]] << " ";
}
return 0;
}