AcWing 135. 最大子序和(使用deque的正确题解)
原题链接
简单
作者:
负壹
,
2020-06-22 13:51:32
,
所有人可见
,
阅读 2078
C++ 代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 300010;
int n,m;
int s[N];
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++){
cin>>s[i];
s[i] += s[i-1];
}
int res = s[1];
deque<int>q;
q.push_back(0);
for(int i = 1;i<=n;i++){
while(q.size()&&q.front()<i-m)q.pop_front();
if(q.size())res = max(res,s[i]-s[q.front()]);
else res = max(res,s[i]-s[i-m]);
while(q.size()&&s[i]<=s[q.back()])q.pop_back();
q.push_back(i);
}
cout<<res;
return 0;
}
s[i-m]不会溢出吗?
我注释了这行也ac了
我明白了,一开始的时候把0加入队列中,所以队列中一直不空,所以那句代码就是没用的了
老哥为什么 i - m > q.font() ??? 我画图怎么是 >= , 不会和前面的push_back(0)有关系吧。。
题中”从中找出一段长度不超过m的连续子序列”那么如果找长度m的就用f[i] - f[i-m],所以i-m这个状态是需要的
你说的不对啊, 假设 下标为 1 2 3 4, 好,现在m = 3, 那么到 4位置的时候,4 - 1 = 3, 3 !> m 所以现在不弹出, 但是现在有4个元素啊
还是不理解 !
你说的例子中,1不能被弹出,因为因为求i~j的和,是sum[j] - sum[i-1],所有求2,3,4的时候,要用前四个的和减去第一个和,所以不弹出