特殊一点的单调队列优化$dp$,需要动一点脑子。同时有$L,R$的限制。
我们可以通过正当到$i$时,将$i-L$入队,即可解决问题。
#include<bits/stdc++.h>
using namespace std;
int n,l,r,x,dp[1000010],a[1000010],q[1000010],ql=1,qr=0,ans=-0x7fffffff;
int main()
{
cin>>n>>l>>r>>x;
for(int i=1;i<=n+r;i++)dp[i]=-0x7fffffff;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n+r-1;i++)
{
while(ql<=qr&&i-q[ql]>r)++ql;
if(i-l>=0)
{
while(ql<=qr&&dp[i-l]>=dp[q[qr]])--qr;
q[++qr]=i-l;
}
if(ql<=qr)dp[i]=dp[q[ql]]+a[i];
if(i>=n)ans=dp[i]>ans?dp[i]:ans;
}
cout<<ans;
}