站外T了,求卡常
查看原帖
站外T了,求卡常
1275495
cai_cai_cai楼主2024/11/22 21:51

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;
}
2024/11/22 21:51
加载中...