23pts 求调
查看原帖
23pts 求调
489890
SFlyer楼主2024/9/24 21:59
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 2.5e5+5;

ll n,st,m,a[N],lsh[N],tot;
ll f[N],g[N],f1[N],g1[N];
ll rt[N],sum[N<<3],siz[N<<3],ls[N<<3],rs[N<<3],cnt;

void ins(int x,ll &y,int l,int r,int p,ll v){
	y=++cnt;
	siz[y]=siz[x]+1;
	sum[y]=sum[x]+v;
	ls[y]=ls[x];
	rs[y]=rs[x];
	if (l==r){
		return;
	}
	int mid=l+r>>1;
	if (p<=mid){
		ins(ls[x],ls[y],l,mid,p,v);
	}
	else{
		ins(rs[x],rs[y],mid+1,r,p,v);
	}
}

ll qy(int x,int y,int l,int r,ll k){
	if (k<=0){
		return 0;
	}
	if (l==r){
		return min(k,siz[y]-siz[x])*lsh[l];
	}
	int mid=l+r>>1;
	if (siz[rs[y]]-siz[rs[x]]>=k){
		return qy(rs[x],rs[y],mid+1,r,k);
	}
	else{
		return sum[rs[y]]-sum[rs[x]]+qy(ls[x],ls[y],l,mid,k-(siz[rs[y]]-siz[rs[x]]));
	}
}

void sol1(int l,int r,int L,int R){
	if (l>r){
		return;
	}
	int mid=l+r>>1;
	ll pos=0;
	for (int i=L; i<=R; i++){
		ll tmp=qy(rt[st-1],rt[i],1,tot,st-i+mid);
		if (tmp>f[mid] || pos==0){
			f[mid]=tmp,pos=i;
		}
	}
	sol1(l,mid-1,L,pos);
	sol1(mid+1,r,pos,R);
}

void sol2(int l,int r,int L,int R){
	if (l>r){
		return;
	}
	int mid=l+r>>1;
	ll pos=0;
	for (int i=R; i>=L; i--){
		ll tmp=qy(rt[i-1],rt[st-1],1,tot,i-st+mid);
		if (tmp>g[mid] || pos==0){
			g[mid]=tmp,pos=i;
		}
	}
	sol2(l,mid-1,L,pos);
	sol2(mid+1,r,pos,R);
}

void sol3(int l,int r,int L,int R){
	if (l>r){
		return;
	}
	int mid=l+r>>1;
	ll pos=0;
	for (int i=L; i<=R; i++){
		ll tmp=qy(rt[st-1],rt[i],1,tot,(st-i)*2+mid);
		if (tmp>f1[mid] || pos==0){
			f1[mid]=tmp,pos=i;
		}
	}
	sol3(l,mid-1,L,pos);
	sol3(mid+1,r,pos,R);
}

void sol4(int l,int r,int L,int R){
	if (l>r){
		return;
	}
	int mid=l+r>>1;
	ll pos=0;
	for (int i=R; i>=L; i--){
		ll tmp=qy(rt[i-1],rt[st-1],1,tot,(i-st)*2+mid);
		if (tmp>g1[mid] || pos==0){
			g1[mid]=tmp,pos=i;
		}
	}
	sol4(l,mid-1,L,pos);
	sol4(mid+1,r,pos,R);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n>>st>>m;
	st++;
	for (int i=1; i<=n; i++){
		cin>>a[i];
		lsh[i]=a[i];
	}
	sort(lsh+1,lsh+1+n);
	tot=unique(lsh+1,lsh+1+n)-lsh-1;
	for (int i=1; i<=n; i++){
		a[i]=lower_bound(lsh+1,lsh+tot+1,a[i])-lsh;
        ins(rt[i-1],rt[i],1,tot,a[i],lsh[a[i]]);
	}
	sol1(1,m,st,min(n,st+m));
	sol2(1,m,max(1ll,st-m),st);
	sol3(1,m,st,min(n,st+m/2));
	sol4(1,m,max(1ll,st-m/2),st);
	ll ans=0;
	for (int i=0; i<=m; i++){
		ans=max(ans,f1[i]+g[m-i]);
		ans=max(ans,g1[i]+f[m-i]);
	}
	cout<<ans<<"\n";
	return 0;
}

// TRY! TRY! TRY!

/*
Think twice before coding. Have you overkilled?
Think twice before submitting.
Check on the samples and constraints carefully.
*/

/*
Be brave to guess.
Is your former/first approach correct?
Follow your intuition.
Use a notebook to note down your ideas and check whether they are correct.
*/

/*
A simple brute force may work? There is some limit on the answer?
Try to find patterns.
*/
2024/9/24 21:59
加载中...