萌新求救
查看原帖
萌新求救
101119
艾恩葛朗特楼主2021/7/17 22:22

思路和正解一致,总是WA(qwq)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int n,k,l,r,x,nk;
long long a[1000005],st[1000005][30],ans;
struct Node{
	int l,r,i,pos;
	long long v;
	bool friend operator <(const Node &fi,const Node &se){
		return fi.v<se.v;
	}
}h,hl,hr;
priority_queue<Node> q;
int mx(int x,int y){
	if(a[x]>a[y]) return x;
	else return y;
}
int mn(int x,int y){
	if(x<y) return x;
	else return y;
}
void work(){
	for (int i=1;i<=nk;i++)
		for (int j=1;j+(1<<(i-1))<=n;j++)
			st[i][j]=mx(st[i-1][j],st[i-1][j+(1<<(i-1))]);
	return ;
}
int main(){
	scanf("%d%d%d%d",&n,&k,&l,&r);
	nk=log(n)/log(2);
	for (int i=1;i<=n;i++){
		scanf("%d",&x);
		a[i]=a[i-1]+x;
		st[0][i]=i;
	}
	work();
	for (int i=1;i+l-1<=n;i++){
		int ll=i+l-1,rr=mn(n,i+r-1),kk;
		kk=log(rr-ll+1)/log(2);
		h.i=i;
		h.l=ll;
		h.r=rr;
		h.pos=mx(st[kk][ll],st[kk][rr+1-(1<<kk)]);
		h.v=a[h.pos]-a[i-1];
		q.push(h);
	}
	while(!q.empty()&&k--){
		h=q.top();
		q.pop();
		ans+=h.v;
		hl=hr=h;
		hl.r=h.pos-1;
		hr.l=h.pos+1;
		if(hl.l<=hl.r){
			int kk=log(hl.r-hl.l+1)/log(2);
			hl.pos=mx(st[kk][hl.l],st[kk][hl.r+1-(1<<kk)]);
			hl.v=a[hl.pos]-a[hl.i-1];
			q.push(hl);
		}
		if(hr.l<=hr.r){
			int kk=log(hr.r-hr.l+1)/log(2);
			hr.pos=mx(st[kk][hr.l],st[kk][hr.r+1-(1<<kk)]);
			hr.v=a[hr.pos]-a[hr.i-1];
			q.push(hr);
		}
	}
	printf("%lld",ans);
	return 0;
}
2021/7/17 22:22
加载中...