某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来。但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸。于是琪露诺决定到河岸去追青蛙。
小河可以看作一列格子依次编号为 到 ,琪露诺只能从编号小的格子移动到编号大的格子。而且琪露诺按照一种特殊的方式进行移动,当她在格子 时,她只移动到区间 中的任意一格。你问为什么她这么移动,这还不简单,因为她是笨蛋啊。
每一个格子都有一个冰冻指数 ,编号为 的格子冰冻指数为 。当琪露诺停留在那一格时就可以得到那一格的冰冻指数 。琪露诺希望能够在到达对岸时,获取最大的冰冻指数。她决定拜托你帮它决定怎样前进。
开始时,琪露诺在编号 的格子上,只要她下一步的位置编号大于 就算到达对岸。
#include<bits/stdc++.h>
// #define int long long
using namespace std;
const int N=1e6+10;
int stk[N],h,t,n,a[N],l,r,f[N],ans;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>l>>r;
for(int i=0;i<=n;i++)cin>>a[i];
stk[0]=0;
memset(f,-0x3f,sizeof f);
f[0]=0;
int ans=-1e9;
h++,t++;
for(int i=l;i<=n;i++){
while(h<=t&&f[stk[t]]<=f[i-l])t--;
stk[++t]=i-l;
while(h<=t&&stk[h]+r<i)h++;
f[i]=f[stk[h]]+a[i];
if(i+r>n)ans=max(ans,f[i]);
}
cout<<ans;
}