对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈里的子段的左端点不能小于当前左端点,需要一起右移 #include<iostream> #include<cstdio> using namespace std; const int N=2000005; int n,d,q[N],l=1,r,ans=d,w; long long p,…
简单题. 考虑没有修改数字的条件的限制,我们直接用双指针扫描就可以计算出答案了. 然后考虑加入修改数字的条件,只要用单调队列维护出当前两个指针表示的区间中长度为$d$的一段区间的最大值,用总和减掉这个最大值更新答案即可. 时间复杂度$O(n)$. Code: #include <cstdio> #include <cstring> using namespace std; typedef long long ll; ; int n, d, q[N]; ll lim, a[N], s…