求助,90分,可持久化线段树,第三个点
查看原帖
求助,90分,可持久化线段树,第三个点
677126
LINCE楼主2022/7/26 11:42

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,k,l,r,a[500002],m,cnt;
long long f[500002],e[500002],g[500002],root[500002],b[500002],ans;
priority_queue<pair<long long,int> >q;
struct node{
	int l,r,cnt;
}t[20000001];
bool v[500001];
int build(int l,int r){
	int p=++cnt;
	if(l==r)return p;
	int mid=(l+r)>>1;
	t[p].l=build(l,mid);
	t[p].r=build(mid+1,r);
	return p;
}
int change(int now,int l,int r,int x){
	int p=++cnt;
	t[p]=t[now];
	if(l==r){
		t[p].cnt++;
		return p;
	}
	int mid=(l+r)>>1;
	if(x<=mid)t[p].l=change(t[now].l,l,mid,x);
		else t[p].r=change(t[now].r,mid+1,r,x);
		t[p].cnt=t[t[p].l].cnt+t[t[p].r].cnt;
		return p;
}
int ask(int p,int q,int l,int r,int k){
	if(l==r)return l;
	int mid=(l+r)>>1;
	int lcnt=t[t[p].l].cnt-t[t[q].l].cnt;
	if(k<=lcnt)return ask(t[p].l,t[q].l,l,mid,k);
		else return ask(t[p].r,t[q].r,mid+1,r,k-lcnt);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k>>l>>r;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i]=f[i-1]+a[i];
		e[i]=f[i];
		b[i]=1;
	}
	sort(e+1,e+1+n);
	for(int i=1;i<=n;i++){
		if(i==1||e[i]!=e[i-1])g[++m]=e[i];
	}
	sort(g+1,g+1+m);
	root[0]=build(1,m);
	for(int i=1;i<=n;i++){
		int t=lower_bound(g+1,g+1+m,f[i])-g;
		root[i]=change(root[i-1],1,m,t);
	}
	for(int i=l;i<=n;i++){
		int ll=max(i-r,1),rr=i-l;
		if(i-r<=0&&g[ask(root[rr],root[0],1,m,1)]>0)q.push(make_pair(f[i],i)),v[i]=1,b[i]=0;
			else q.push(make_pair(f[i]-g[ask(root[rr],root[ll-1],1,m,1)],i));
	}
	for(int i=1;i<=k;i++){
		pair<long long,int>w=q.top();
		q.pop();
		ans+=w.first;
		if(w.second!=l){
			b[w.second]++;
			int ll=max(w.second-r,1),rr=w.second-l;
			if(w.second-r<=0&&!v[w.second]&&g[ask(root[rr],root[0],1,m,b[w.second])]>0)q.push(make_pair(f[w.second],w.second)),v[w.second]=1,b[w.second]--;
				else q.push(make_pair(f[w.second]-g[ask(root[rr],root[ll-1],1,m,b[w.second])],w.second));
		}
	}
	cout<<ans;
}
2022/7/26 11:42
加载中...