#include<bits/stdc++.h>
#define int long long
#define len(l,r) r-l+1
#define s(x) (1<<x)
using namespace std;
struct node{
int l,r1,r2,jz,lar;
bool operator<(const node &rhs)const{return jz<rhs.jz;}
}tp;
priority_queue<node>q;
int n,k,l,r,id,ans=0,bz[500005],a[500005],sum[500005],st[500005][20/*2^18<500000<2^19*/],num[500005][20];
void yu(){
bz[1]=0;
bz[2]=1;
for(int i=3;i<=500005;i++)bz[i]=bz[i/2]+1;
for(int i=1;i<=n;i++){
st[i][0]=sum[i];
num[i][0]=i;
}
for(int j=1;j<=19;j++)
for(int i=1;i+s(j)<=n+1;i++)
if(st[i][j-1]>st[i+s(j-1)][j-1]){
st[i][j]=st[i][j-1];
num[i][j]=num[i][j-1];
}else{
st[i][j]=st[i+s(j-1)][j-1];
num[i][j]=num[i+s(j-1)][j-1];
}
}
int maxx(int l,int r,int &id){
int flag=(st[l][bz[len(l,r)]]>st[r-s(bz[len(l,r)])+1][bz[len(l,r)]])?1:0;
id=flag?num[l][bz[len(l,r)]]:num[r-s(bz[len(l,r)])+1][bz[len(l,r)]];
return flag?st[l][bz[len(l,r)]]:st[r-s(bz[len(l,r)])+1][bz[len(l,r)]];
}
signed main(){
scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
yu();
for(int i=1;i<=len(l,n);i++)q.push({i,i+l-1,min(i+r-1,n),maxx(i+l-1,min(i+r-1,n),id)-sum[i-1],id});
for(int i=1;i<=k;i++){
tp=q.top();
q.pop();
ans+=tp.jz;
if(tp.lar>tp.r1)q.push({tp.l,tp.r1,tp.lar-1,maxx(tp.r1,tp.lar-1,id)-sum[tp.l-1],id});
if(tp.lar<tp.r2)q.push({tp.l,tp.lar+1,tp.r2,maxx(tp.lar+1,tp.r2,id)-sum[tp.l-1],id});
}
printf("%lld",ans);
return 0;
}
数据输入1:
10 13 3 7
595
384
-435
-197
-677
661
4
-100
-653
220
数据输出1
1112
我的输出
评测结果:
不理解!!!
求调!!!