RT,洛谷A了的
站外时限1000ms,空间256MiB,编译器是Hydro的。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,l,r,sum,b[500005];
namespace joker{//手写堆
int n,a[1000005];
void insert(int t){
a[++n]=t;
int x=n;
while(x>1&&a[x/2]>a[x]){
swap(a[x/2],a[x]);
x/=2;
}
}
void del(){
swap(a[1],a[n]);a[n--]=a[0];
int x=1;
while(x*2<=n){
int j=x*2;
if(a[x*2]>a[x*2+1]){
j=x*2+1;
}
if(a[x]<=a[j])break;
swap(a[x],a[j]);
x=j;
}
}
}
set<pair<int,int>,greater<pair<int,int>>>q;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
memset(joker::a,0x3f,sizeof(joker::a));
cin>>n>>k>>l>>r;
for(int i=1;i<=n;++i){
cin>>b[i];
b[i]+=b[i-1];
}
int L=l-1,R=r-1;
for(int i=max(L,1ll);i<=R;++i){
q.insert({b[i],i});
}
for(int i=0;L<n;++i){
++R;
++L;
if(R<=n)q.insert({b[R],R});
if(q.empty())break;
for(auto it=q.begin();it!=q.end();){
auto t=*it;
if(t.second<L){
it=q.erase(it);
continue;
}
int x=t.first-b[i];
if(joker::n<k){
joker::insert(x);
}else{
if(x<=joker::a[1])break;
joker::del();
joker::insert(x);
}
++it;
}
}
int sum=0;
while(joker::n){
sum+=joker::a[1];
joker::del();
}
cout<<sum;
return 0;
}