Pre
尽管只是一道蓝题,还是有一点说的必要,强调推论的重要性。
Solution
可以证明答案不可能小于(d),而且去掉的区间长度不可能小于(d),也就是一定为(d)。
直接维护单调队列就可以了。
Code
#include<bits/stdc++.h>
#define xx first
#define yy second
#define ll long long
using namespace std;
const ll N = 2000000 + 5;
inline ll Max (ll m, ll n) {
return m > n ? m : n;
}
ll n, p, d;
ll info[N], sum[N], q[N], head, tail, ans, l, r;
inline void solve () {
tail = head = 1;
q[1] = d;
l = 1;
while (r < n) {
r++;
while (tail >= head && sum[q[tail]] - sum[q[tail] - d] < sum[r] - sum[r - d]) {
tail--;
}
q[++tail] = r;
bool flag = true;
while (flag) {
flag = false;
if (tail >= head && q[head] - d + 1 < l) {
head++;
flag = true;
continue;
}
if (sum[r] - sum[l - 1] - (sum[q[head]] - sum[q[head] - d]) > p) {
l++;
flag = true;
continue;
}
}
ans = Max (ans, r - l + 1);
}
printf ("%lld
", ans);
}
int main () {
scanf ("%lld%lld%lld", &n, &p, &d);
ans = d;
for (int i = 1; i <= n; ++i) {
scanf ("%lld", &info[i]);
sum[i] = sum[i - 1] + info[i];
}
solve ();
return 0;
}
Conclusion
这个结论有点不可思议,但是一旦利用好了,就可以(A)掉这道题。
忘了初始化(l),(WA)了几发。