思路和正解一致,总是WA(qwq)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int n,k,l,r,x,nk;
long long a[1000005],st[1000005][30],ans;
struct Node{
int l,r,i,pos;
long long v;
bool friend operator <(const Node &fi,const Node &se){
return fi.v<se.v;
}
}h,hl,hr;
priority_queue<Node> q;
int mx(int x,int y){
if(a[x]>a[y]) return x;
else return y;
}
int mn(int x,int y){
if(x<y) return x;
else return y;
}
void work(){
for (int i=1;i<=nk;i++)
for (int j=1;j+(1<<(i-1))<=n;j++)
st[i][j]=mx(st[i-1][j],st[i-1][j+(1<<(i-1))]);
return ;
}
int main(){
scanf("%d%d%d%d",&n,&k,&l,&r);
nk=log(n)/log(2);
for (int i=1;i<=n;i++){
scanf("%d",&x);
a[i]=a[i-1]+x;
st[0][i]=i;
}
work();
for (int i=1;i+l-1<=n;i++){
int ll=i+l-1,rr=mn(n,i+r-1),kk;
kk=log(rr-ll+1)/log(2);
h.i=i;
h.l=ll;
h.r=rr;
h.pos=mx(st[kk][ll],st[kk][rr+1-(1<<kk)]);
h.v=a[h.pos]-a[i-1];
q.push(h);
}
while(!q.empty()&&k--){
h=q.top();
q.pop();
ans+=h.v;
hl=hr=h;
hl.r=h.pos-1;
hr.l=h.pos+1;
if(hl.l<=hl.r){
int kk=log(hl.r-hl.l+1)/log(2);
hl.pos=mx(st[kk][hl.l],st[kk][hl.r+1-(1<<kk)]);
hl.v=a[hl.pos]-a[hl.i-1];
q.push(hl);
}
if(hr.l<=hr.r){
int kk=log(hr.r-hr.l+1)/log(2);
hr.pos=mx(st[kk][hr.l],st[kk][hr.r+1-(1<<kk)]);
hr.v=a[hr.pos]-a[hr.i-1];
q.push(hr);
}
}
printf("%lld",ans);
return 0;
}