思路是枚举右端点。求调,谢谢。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[500005][20],a[500005];
int n,k,l,r;
struct Data {
int y,l,r,p,v;
Data(int a,int b,int c,int d,int e) {
y=a,l=b,r=c,p=d,v=e;
return ;
}
};
struct Cmp {
bool operator()(Data x,Data y) {
return x.v<y.v;
}
};
priority_queue<Data,vector<Data>,Cmp> q;
void init() {
for(int i=1;i<=n;i++) f[i][0]=a[i];
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j+(1<<i)-1<=n;j++)
f[j][i]=min(f[j][i-1],f[j+(1<<i-1)][i-1]);
return ;
}
int calc(int l,int r) {
int k=log2(r-l+1);
return f[l][k]<f[r-(1<<k)+1][k]?l:r;
}
int main() {
ll ans=0;
scanf("%d%d%d%d",&n,&k,&l,&r);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),a[i]+=a[i-1];
init();
for(int i=l;i<=n;i++) {
int pos=calc(l,r);
q.push(Data(i,max(i-r,0),i-l,pos,a[i]-a[pos-1]));
}
while(k--) {
int y=q.top().y,l2l=q.top().l,rr=q.top().r;
int p=q.top().p,v=q.top().v;
ans+=v,q.pop();
if(p-1>=l) q.push(Data(y,l2l,rr,p-1,a[y]-a[p-1]));
if(p+1<=r) q.push(Data(y,l2l,rr,p+1,a[y]-a[p+1]));
}
printf("%lld\n",ans);
return 0;
}