最大子序和
暴力做法(70分)
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int N=3e5+10;
int n,m,ans;
int sum[N];
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>sum[i];
sum[i]+=sum[i-1];
}
ans=-INF;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if((i-j)<=m){
ans=max(ans,sum[i]-sum[j]);
}
}
}
cout<<ans;
return 0;
}
单调队列优化
sum(i)-sum(j)每次单调队列维护[i-m,i]内的sum(j)最小值,复杂度变为O(n)
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int N=3e5+10;
int n,m,ans;
int sum[N],q[N];
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>sum[i];
sum[i]+=sum[i-1]; //这种写法值得学习
}
ans=-INF;
int h