LuoGuP3594:[POI2015]WIL-Wilcze doły

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)了几发。

原文地址:https://www.cnblogs.com/ChiTongZ/p/11181271.html