单调区间
最大子序和
#include<algorithm>
#include<climits>
#include<deque>
#include<iostream>
using namespace std;
const int N=3e5+10;
typedef long long ll;
int n,m;
deque<int> q;
ll s[N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];
s[i]+=s[i-1];
}
ll res=INT_MIN;
q.push_back(0);
for(int i=1;i<=n;i++){
if(!q.empty()&&i-q.front()>m)
q.pop_front();
res=max(res,s[i]-s[q.front()]);
while(!q.empty()&&s[q.back()]>=s[i])
q.pop_back();
q.push_back(i);
}
cout<<res<<endl;
}
斜率优化 https://www.acwing.com/problem/content/description/302/
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5010;
int t[N],c[N];
int f[N];
int n,s;
int main(){
cin>>n>>s;
for(int i=1;i<=n;i++){
cin>>t[i]>>c[i];
t[i]+=t[i-1];
c[i]+=c[i-1];
}
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
f[i]=min(f[i],f[j]+(c[i]-c[j])*t[i]+(c[n]-c[j])*s);
cout<<f[n]<<endl;
}