MnZn RE 求调 qwq
查看原帖
MnZn RE 求调 qwq
511609
无钩七不改名楼主2023/8/12 09:58
#include<bits/stdc++.h>
using namespace std;

const int N=500005;

long long n,k,a[N];
long long ans,lx,rx;
multiset<long long> l,r;

long long read(){
	int f=1;long long k=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	} 
	while(c>='0'&&c<='9'){
		k=k*10+c-'0';
		c=getchar();
	}
	return f*k;
}

int main(){
	n=read();k=read();
	for(int i(1);i<=n;++i)a[i]=read();
	for(int i(1);i<=k;++i)l.insert(a[i]),lx+=a[i];
	for(int i(1);i<=k/2;++i){
		//cout<<"*"<<i<<'\n';
		int lar=*(--l.end());
		l.erase(--l.end());
		r.insert(lar);
		lx-=lar,rx+=lar;
	}int lar=*(--l.end());//cout<<k<<" "<<lar<<" "<<lx<<" "<<rx<<'\n';
	ans=1ll*lar*l.size()-lx+rx-1ll*lar*r.size();
	for(int i(k+1);i<=n;++i){
		if(a[i-k]<=lar)l.erase(l.find(a[i-k])),lx-=a[i-k];
		else r.erase(r.find(a[i-k])),rx-=a[i-k];
		if(a[i]<=lar)l.insert(a[i]),lx+=a[i];
		else r.insert(a[i]),rx+=a[i];
		while(l.size()>=r.size()+2){
			lar=*(--l.end());
			l.erase(--l.end());
			r.insert(lar);
			lx-=lar,rx+=lar;
		}
		if(l.size())lar=*(--l.end());
		while(l.size()<r.size()){
			int rar=*(r.begin());
			r.erase(r.begin());
			l.insert(rar);
			lx+=rar,rx-=rar;
			lar=*(--l.end());
		}
		//cout<<i<<" "<<lar<<" "<<lx<<" "<<rx<<" "<<l.size()<<" "<<r.size()<<'\n';
		ans=min(ans,(long long)(1ll*lar*l.size()-lx+rx-1ll*lar*r.size()));
	}
	printf("%lld",ans);
	return 0;
}

thx qwq

2023/8/12 09:58
加载中...