yicongli

T158T3

Mar 22nd, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e6+7;
  17.  
  18. int n;
  19. ll m;
  20. int a[N];
  21. int b[N];
  22.  
  23. int siz[N<<2];
  24.  
  25. #define ls (rt<<1)
  26. #define rs (rt<<1|1)
  27.  
  28. void insert(int rt,int l,int r,int x){
  29.     siz[rt]++;
  30.     if(l==r)return ;
  31.     int mid=(l+r)>>1;
  32.     if(x<=mid)insert(ls,l,mid,x);
  33.     else insert(rs,mid+1,r,x);
  34. }
  35.  
  36. int query(int rt,int l,int r,int x){
  37.     if(r<=x)return siz[rt];
  38.     int mid=(l+r)>>1;
  39.     if(x<=mid)return query(ls,l,mid,x);
  40.     else return query(ls,l,mid,x)+query(rs,mid+1,r,x);
  41. }
  42.  
  43. int kth(int rt,int l,int r,int x){
  44.     if(l==r)return l;
  45.     int mid=(l+r)>>1;
  46.     if(x<=siz[ls])return kth(ls,l,mid,x);
  47.     else return kth(rs,mid+1,r,x-siz[ls]);
  48. }
  49.  
  50. inline void work(int k,int x){
  51.     for(int i=1;i<=n;++i){
  52.         if(i<=k)b[i]=i;
  53.         else if(query(1,1,n,a[i])>=k)b[i]=a[i];
  54.         else b[i]=kth(1,1,n,k);
  55.         insert(1,1,n,a[i]);
  56.     }
  57.     for(int i=k+2;i<=n;++i){
  58.         if(b[i]<b[k+1])swap(b[k+1],b[i]);
  59.         if(!--x)break;
  60.     }
  61.     for(int i=1;i<=n;++i){
  62.         printf("%d ",b[i]);
  63.     }
  64.     exit(0);
  65. }
  66.  
  67. int main(){
  68.     freopen("sort.in","r",stdin);
  69.     freopen("sort.out","w",stdout);
  70.     r(n),r(m);
  71.     for(int i=1;i<=n;++i){
  72.         r(a[i]);
  73.     }
  74.     for(int i=1;i<=n;++i){
  75.         if(m>n-i)m-=n-i;
  76.         else work(i-1,m);
  77.     }
  78.     for(int i=1;i<=n;++i){
  79.         printf("%d ",i);
  80.     }
  81. }
  82. /*
  83. 9
  84. 36
  85. 1 9 8 2 3 7 5 4 6
  86.  
  87. */
Add Comment
Please, Sign In to add comment