BZOJ3580的简化版。
记
fi
f
i
表示第
i
i
个数前面比它大的数的个数。
若 ,在
k
k
次操作后它前面所有数一定都比它小,否则它最终的位置为 。
把所有
fi≤k
f
i
≤
k
的数排一遍序,依次放入没有数的位置就好了。
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair<int,int> abcd;
const int N=200010;
int l,r,Ans;
int b[N],c[N];
int d[N],len;
int A[N];
int f[N];
int k,n,m;
abcd a[N];
inline int Query(int x){
int Ans=0;
for(;x;x-=x&-x)Ans+=c[x];
return Ans;
}
inline void Update(int x){
for(;x<=n;x+=x&-x)c[x]++;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].fi);
a[i].se=i;
}
sort(a+1,a+n+1);
for(int i=n;i;i--){
b[a[i].se]=Query(a[i].se);
f[a[i].se]=a[i].fi;
Update(a[i].se);
}
for(int i=1;i<=n;i++)
if(b[i]<=k)d[++len]=f[i];else A[i-k]=f[i];
sort(d+1,d+len+1);
len=0;
for(int i=1;i<=n;i++)if(!A[i])A[i]=d[++len];
for(int i=1;i<=n;i++)printf("%d\n",A[i]);
return 0;
}