1 条题解

  • 0
    @ 2025-10-8 17:03:00
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=2e5+10;
    #define lc(p) tr[p].l
    #define rc(p) tr[p].r
    mt19937 rnd(114514);
    struct node{int l,r,v,s,siz,k;}tr[N];int trlen,rt;
    int newd(int v){tr[++trlen]={0,0,v,v,1,rnd()};return trlen;}
    void pushup(int p)
    {
    	tr[p].s=tr[lc(p)].s+tr[rc(p)].s+tr[p].v;
    	tr[p].siz=tr[lc(p)].siz+tr[rc(p)].siz+1;
    }
    void split(int p,int v,int &x,int &y)
    {
    	if(!p){x=y=0;return;}
    	if(tr[p].v<=v)
    	{
    		x=p;
    		split(rc(p),v,rc(x),y);
    	}
    	else
    	{
    		y=p;
    		split(lc(p),v,x,lc(y));
    	}
    	pushup(p);
    }
    int merge(int x,int y)
    {
    	if(!x||!y)return x+y;
    	if(tr[x].k<tr[y].k)
    	{
    		rc(x)=merge(rc(x),y);
    		pushup(x);
    		return x;
    	}
    	else
    	{
    		lc(y)=merge(x,lc(y));
    		pushup(y);
    		return y;
    	}
    }
    void add(int v)
    {
    	int x,y,z;
    	split(rt,v-1,x,y);
    	z=newd(v);
    	rt=merge(merge(x,z),y);
    }
    void del(int v)
    {
    	int x,y,z;
    	split(rt,v-1,x,y);
    	split(y,v,y,z);
    	y=merge(lc(y),rc(y));
    	rt=merge(merge(x,y),z);
    }
    int getk(int p,int k)
    {
    	if(!p)return 0;
    	if(k<=tr[lc(p)].siz)
    		return getk(lc(p),k);
    	if(k==tr[lc(p)].siz+1)
    		return p;
    	return getk(rc(p),k-tr[lc(p)].siz-1);
    }
    int a[N];
    signed main()
    {
    	int n,k;cin>>n>>k;
    	int mx,id,res;mx=1e18;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		add(a[i]);if(i>k)del(a[i-k]);
    		if(i<k)continue;
    		int mid=getk(rt,(k+1)/2),x,y,sum1,sum2,siz1,siz2;
    		mid=tr[mid].v;
    //		cout<<"v:"<<mid<<'\n';
    		split(rt,mid-1,x,y);
    		sum1=tr[x].s,siz1=tr[x].siz;
    		rt=merge(x,y);
    		split(rt,mid,x,y);
    		sum2=tr[y].s,siz2=tr[y].siz;
    		rt=merge(x,y);
    //		cout<<sum1<<' '<<siz1<<' '<<sum2<<' '<<siz2<<'\n';
    		int sum=sum2-siz2*mid+siz1*mid-sum1;
    //		cout<<sum<<'\n';
    		if(sum<mx)mx=sum,id=i,res=mid;
    	}
    	for(int i=id-k+1;i<=id;i++)a[i]=res;
    	cout<<mx<<'\n';
    	for(int i=1;i<=n;i++)cout<<a[i]<<'\n';
    	return 0;
    }
    
    • 1

    信息

    ID
    2765
    时间
    1000ms
    内存
    1028MiB
    难度
    9
    标签
    递交数
    68
    已通过
    5
    上传者