爆RE 求调
查看原帖
爆RE 求调
766639
_LittleBoat_楼主2023/8/15 20:11
#include <bits/stdc++.h>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const ll maxn=5e5+10;
struct node{
	ll o;
	ll l;
	ll r;
	ll w;
	bool operator<(node b)const {
		return w<b.w;
	}
};
ll n,k,L,R,arr[maxn],st[22][maxn],lg2[maxn],pos[22][maxn],ans=0;
priority_queue<node>G;

pii query(ll l,ll r){
	ll LOG=lg2[r-l+1];
	ll p=r-(1<<LOG)+1;
	if(st[LOG][l]>st[LOG][p]){
		return {st[LOG][l],pos[LOG][l]};
	}else return {st[LOG][p],pos[LOG][p]};
}

int main(){
	lg2[1]=0;
	memset(st,0,sizeof(st));
	for(ll i=2;i<maxn;i++)lg2[i]=lg2[i>>1]+1;
	cin>>n>>k>>L>>R;
	for(ll i=1;i<=n;i++){
		scanf("%lld",&arr[i]);
	}
	for(ll i=1;i<=n;i++){
		st[0][i]=arr[i]+st[0][i-1];
		pos[0][i]=i;
	}
	for(ll j=1;(1<<j)<=n;j++){
		for(ll i=1;i+(1<<j)-1<=n;i++){
			ll p=i+(1<<(j-1));
			if(st[j-1][i]>st[j-1][p]){
				st[j][i]=st[j-1][i];
				pos[j][i]=pos[j-1][i];
			}else{
				st[j][i]=st[j-1][p];
				pos[j][i]=st[j-1][p];
			}
		}
	}
	for(ll i=1;i<=n-L+1;i++){
		G.push(node{i,i+L-1,min(i+R-1,n),query(i+L-1,min(i+R-1,n)).first-st[0][i-1]});
	}
	for(ll i=1;i<=k;i++){
		node now=G.top();G.pop();
		ans+=now.w;
		ll pos=query(now.l, now.r).second;
		if(pos!=now.l)G.push(node{now.o,now.l,pos-1,query(now.l,pos-1).first-st[0][now.o-1]});
		if(pos!=now.r)G.push(node{now.o,pos+1,now.r,query(pos+1,now.r).first-st[0][now.o-1]});
	}
	printf("%lld\n",ans);
	return 0;
}
2023/8/15 20:11
加载中...