P1725 琪露诺(单调队列dp)


这题最开始数据比较水,后来加强了,我没过hack数据,我的代码最主要的问题是有一些点会从前面无法经过的点更新,所以就需要初始化f为最小值

#include<iostream>
#include<cstring>
using namespace std;
#define int long long 
const int N=1e6;
int q[N];
int w[N];
int f[N];
signed main(){
    int n,l,r;
    cin>>n>>l>>r;
    int x;
    cin>>x;
    memset(f,-0x3f,sizeof(f));
    f[0]=0;
    for(int i=1;i<=n;i++)cin>>w[i];
         int h=1,t=0;
         int ans=-1e9;
    for(int i=l;i<=n;i++){
        while(h<=t&&q[h]<i-r)h++;
        while(h<=t&&f[q[t]]<=f[i-l])t--;
      q[++t]=i-l;
        f[i]=f[q[h]]+w[i];
        if(i>n-r)ans=max(ans,f[i]);
    }
    cout<<ans;
    return 0;
}
posted @ 2025-02-15 20:44  郭轩均  阅读(37)  评论(0)    收藏  举报