样例过了却RE,求助.
查看原帖
样例过了却RE,求助.
550970
Aliya_Hyacinth楼主2024/3/29 22:29
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll lg[2000001],dp[2000004][40],num[2000004][40];

struct node{
	ll lid,rid,num,w;
	ll data;
	bool operator < (node i) const{
		return data<i.data;
	}
};

priority_queue<node> h;

ll ans;
ll c[5000004];
ll n,k,x,y,l,r;

void add(ll s,ll l,ll r,ll posi){
	node op;
	op.data=c[posi]-c[s-1];
	op.lid=l;
	op.rid=r;
	op.w=posi;
	op.num=s;
	h.push(op);
	return ;
}

void st_work(){
	lg[0]=-1;
	for(int i=1;i<=n;i++){
		scanf("%lld",&c[i]);
		lg[i]=lg[i>>1]+1;
		c[i]=c[i]+c[i-1];
		dp[i][0]=c[i];
		num[i][0]=i;
	}
	for(int j=1;j<=lg[n];j++)
		for(int i=1;i<=n+1-(1<<j);i++){
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
			if(dp[i][j]==dp[i][j-1])
				num[i][j]=num[i][j-1];
			else
				num[i][j]=num[i+1<<(j-1)][j-1];
		}
}

ll st_find(ll x,ll y){
	int l=lg[y-x+1];
	return max(dp[x][l],dp[y-(1<<l)+1][l]);
}

ll pos(ll x,ll y){
	ll sj;
	int l=lg[y-x+1];
	if(st_find(x,y)==dp[x][l])
		sj=num[x][l];
	else
		sj=num[y-(1<<l)+1][l];
	return sj;
}

int main(){
	scanf("%d%d%d%d",&n,&k,&l,&r);
	st_work();
	for(int i=1;i+l-1<=n;i++)
		add(i,i+l-1,min(i+r-1,n),pos(i+l-1,min(i+r-1,n)));
	while(k--){
		int isum,inum,il,ir,imid;
		il=h.top().lid;
		ir=h.top().rid;
		inum=h.top().num;
		imid=h.top().w;
		isum=h.top().data;
		ans+=isum;
		h.pop();
		if(imid>il)
			add(inum,il,imid-1,pos(il,imid-1));
		if(imid<ir)
			add(inum,imid+1,ir,pos(imid+1,ir));
	}
	printf("%lld",ans);
	return 0;
}
2024/3/29 22:29
加载中...