1 条题解
-
0
#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
- 上传者