样例错,求调RMQ(玄关)
查看原帖
样例错,求调RMQ(玄关)
806330
LinkCatTree楼主2023/9/23 21:07

思路是枚举右端点。求调,谢谢。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[500005][20],a[500005];
int n,k,l,r;
struct Data {
	int y,l,r,p,v;
	Data(int a,int b,int c,int d,int e) {
		y=a,l=b,r=c,p=d,v=e;
		return ;
	}
};
struct Cmp {
	bool operator()(Data x,Data y) {
		return x.v<y.v;
	}
};
priority_queue<Data,vector<Data>,Cmp> q;
void init() {
	for(int i=1;i<=n;i++) f[i][0]=a[i];
	for(int i=1;(1<<i)<=n;i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			f[j][i]=min(f[j][i-1],f[j+(1<<i-1)][i-1]);
	return ;
}
int calc(int l,int r) {
	int k=log2(r-l+1);
	return f[l][k]<f[r-(1<<k)+1][k]?l:r;
}
int main() {
	ll ans=0;
	scanf("%d%d%d%d",&n,&k,&l,&r);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]),a[i]+=a[i-1];
	init();
	for(int i=l;i<=n;i++) {
		int pos=calc(l,r);
		q.push(Data(i,max(i-r,0),i-l,pos,a[i]-a[pos-1]));
	}
	while(k--) {
		int y=q.top().y,l2l=q.top().l,rr=q.top().r;
		int p=q.top().p,v=q.top().v;
		ans+=v,q.pop();
		if(p-1>=l) q.push(Data(y,l2l,rr,p-1,a[y]-a[p-1]));
		if(p+1<=r) q.push(Data(y,l2l,rr,p+1,a[y]-a[p+1]));
	}
	printf("%lld\n",ans);
	return 0;
}
2023/9/23 21:07
加载中...