蒟蒻萌新菜鸡刚学fhqtreap,20分求助!!!
查看原帖
蒟蒻萌新菜鸡刚学fhqtreap,20分求助!!!
226387
WESTRAIN楼主2020/7/31 16:03
#include<bits/stdc++.h>
using namespace std;
long long n,k;
long long a[100001];
struct NODE {
	long long v;
	long long key;
	long long sum;
	long long size;
	long long l;
	long long r;
} node[100001];
long long cnt,rot;
void up(long long now) {
	node[now].size=1+node[node[now].l].size+node[node[now].r].size;
	node[now].sum=node[node[now].l].sum+node[node[now].r].sum+node[now].v;
}
void split(long long rot,long long k,long long &r1,long long &r2) {
	if(rot==0) {
		r1=r2=0;
		return ;
	}
	if(node[rot].v<=k) {
		r1=rot;
		split(node[r1].r,k,node[r1].r,r2);
	}else {
		r2=rot;
		split(node[r2].l,k,r1,node[r2].l);
	}
	up(rot);
}
long long merge(long long r1,long long r2) {
	if(!r1||!r2) return r1+r2;
	if(node[r1].key<node[r2].key) {
		node[r1].r=merge(node[r1].r,r2);
		up(r1);
		return r1;
	} else {
		node[r2].l=merge(r1,node[r2].l);
		up(r2);
		return r2;
	}
}
void insert(long long x) {
	node[++cnt].v=x;
	node[cnt].key=rand();
	node[cnt].sum=0;
	node[cnt].l=node[cnt].r=0;
	node[cnt].size=1;
	long long r1=0,r2=0;
	split(rot,x,r1,r2);
	r1=merge(r1,cnt);
	rot=merge(r1,r2);
}
void del(long long x) {
	long long r1=0,r2=0,r3=0,r4=0;
	split(rot,x,r1,r2); //r1<=x,r2>x
	split(r1,x-1,r3,r4);//r3<x,r4=x;
	r4=merge(node[r4].l,node[r4].r);
	rot=merge(merge(r3,r4),r2);
}
long long knum(long long now,long long k) {
	if(node[node[now].l].size+1==k) {
		return now;
	}
	if(node[node[now].l].size<k) {
		return knum(node[now].r,k-node[node[now].l].size-1);
	}else {
		return knum(node[now].l,k);
	}
}
int main() {
    cin>>n>>k;
	for(long long i=1;i<=n;i++) {
		cin>>a[i];
	}
	long long l=1,r=k,ans=1000000000,ansl=0,ansr=0,ansmid=0;
	for(long long i=l;i<=r;i++) insert(a[i]);
	long long mid_num=(k-1)/2+1;
	while(r!=n+1) {
		long long mid=knum(rot,mid_num);
		long long r1=0,r2=0,r3=0,r4=0;
		split(rot,node[mid].v,r1,r2);
		split(r1,node[mid].v-1,r3,r4);
		//cout<<node[r3].size<<" "<<node[r3].sum<<" "<<node[r2].size<<" "<<node[r2].sum<<" "<<node[mid].v<<endl; 
		long long tot=node[mid].v*node[r3].size-node[r3].sum+node[r2].sum-node[mid].v*node[r2].size;
		if(tot<ans) {
			ans=tot;
			ansl=l,ansr=r,ansmid=node[mid].v;
		}
		long long rot=merge(merge(r3,r4),r2);
	    del(a[l]);
		l++;
		r++;
		if(r>n) break;		
		insert(a[r]);
	}
	cout<<ans<<endl;
	//cout<<ans<<endl<<ansl<<" "<<ansr<<" "<<ansmid<<endl;
	for(long long i=1;i<=n;i++) {
		if(i>=ansl&&i<=ansr) {
			cout<<ansmid<<endl;
		}else
		cout<<a[i]<<endl;
	}	
	return 0;
} 
2020/7/31 16:03
加载中...