【bzoj1552/3506】[Cerc2007]robotic sort

Description

Input

输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000。第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号。

Output

输出共一行,N个用空格隔开的正整数P1,P2,P3…Pn,(1 < = Pi < = N),Pi表示第i次操作前第i小的物品所在的位置。 注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品)。

Sample Input

6
3 4 5 1 6 2

Sample Output

4 6 4 5 6 6
 
题解:裸题
  1. #include<cstring>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cstdio>
  6.  
  7. #define inf 1000000007
  8. #define N 100007
  9. #define ls c[p][0]
  10. #define rs c[p][1]
  11. using namespace std;
  12. inline int read()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
  16. while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19.  
  20. int n,rt;
  21. int a[N],rev[N],mi[N],flag[N],fa[N],sz[N],c[N][],val[N],s[N];
  22.  
  23. void update(int p)
  24. {
  25. sz[p]=sz[ls]+sz[rs]+;
  26. mi[p]=val[p],flag[p]=p;
  27. if ((mi[ls]<mi[p])||(mi[ls]==mi[p]&&flag[p]>flag[ls])) mi[p]=mi[ls],flag[p]=flag[ls];
  28. if ((mi[rs]<mi[p])||(mi[rs]==mi[p]&&flag[p]>flag[rs])) mi[p]=mi[rs],flag[p]=flag[rs];
  29. }
  30. void pushdown(int p)
  31. {
  32. if (rev[p])
  33. {
  34. rev[p]^=,rev[ls]^=,rev[rs]^=;
  35. swap(c[p][],c[p][]);
  36. }
  37. }
  38. void build(int l,int r,int f)
  39. {
  40. if (l>r) return;
  41. if (l==r)
  42. {
  43. val[l]=a[l],sz[l]=,fa[l]=f,mi[l]=a[l],flag[l]=l;
  44. if (l<f) c[f][]=l;
  45. else c[f][]=l;
  46. return;
  47. }
  48. int mid=(l+r)>>;
  49. build(l,mid-,mid),build(mid+,r,mid);
  50. if (mid<f) c[f][]=mid;
  51. else c[f][]=mid;
  52. fa[mid]=f,val[mid]=a[mid],mi[mid]=a[mid],flag[mid]=mid;
  53. update(mid);
  54. }
  55. void rotate(int x,int &k)
  56. {
  57. int y=fa[x],z=fa[y],l,r;
  58. if (c[y][]==x) l=;else l=;r=l^;
  59. if (y==k) k=x;//交换后x就等于y
  60. else if (c[z][]==y) c[z][]=x;
  61. else c[z][]=x;
  62. fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
  63. c[y][l]=c[x][r],c[x][r]=y;
  64. update(y),update(x);
  65. }
  66. void splay(int x,int &k)
  67. {
  68. int top=;s[++top]=x;
  69. for(int i=x;fa[i];i=fa[i])
  70. s[++top]=fa[i];
  71. for(int i=top;i;i--)
  72. if(rev[s[i]])pushdown(s[i]);
  73. while(x!=k)
  74. {
  75. int y=fa[x],z=fa[y];
  76. if (y!=k)
  77. {
  78. if (c[y][]==x^c[z][]==y) rotate(x,k);
  79. else rotate(y,k);
  80. }
  81. rotate(x,k);
  82. }
  83. }
  84. int find(int p,int num)
  85. {
  86. pushdown(p);
  87. if (sz[ls]>=num) return find(ls,num);
  88. else if (sz[ls]+==num) return p;
  89. else return find(rs,num-sz[ls]-);
  90. }
  91. int query(int l,int r)
  92. {
  93. int x=find(rt,l),y=find(rt,r+);
  94. splay(x,rt),splay(y,c[x][]);
  95. int now=c[y][];
  96. return flag[now];
  97. }
  98. void spin(int l,int r)
  99. {
  100. int x=find(rt,l),y=find(rt,r+);
  101. splay(x,rt),splay(y,c[x][]);
  102. int now=c[c[x][]][];
  103. rev[now]^=;
  104. }
  105. int main()
  106. {
  107. freopen("fzy.in","r",stdin);
  108. freopen("fzy.out","w",stdout);
  109.  
  110. int n=read();
  111. for (int i=;i<=n+;i++)
  112. a[i]=read();
  113. a[]=a[n+]=a[]=inf,mi[]=inf;
  114. build(,n+,),rt=(+n+)>>;
  115. for (int i=;i<=n;i++)
  116. {
  117. int wei=query(i,n);
  118. splay(wei,rt);
  119. if (i!=n) printf("%d ",sz[c[wei][]]);
  120. else printf("%d",sz[c[wei][]]);
  121. spin(i,sz[c[wei][]]);
  122. }
  123. }

【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值的更多相关文章

  1. 【BZOJ1552】[Cerc2007]robotic sort Splay

    [BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...

  2. 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序

    FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...

  3. BZOJ1552/3506 [Cerc2007]robotic sort

    Splay 与之前不同的是如果你仅仅是翻转左右区间的话可以在find里面做因为对他有影响的子树在做之前一定在他的上面从上到下搜索的过程可以把rever做了. 但这道题要求我们输出转换之前的,因此不能保 ...

  4. 【BZOJ-1552&3506】robotic sort&排序机械臂 Splay

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 806  Solved: 329[Submit][ ...

  5. BZOJ 1552: [Cerc2007]robotic sort( splay )

    kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...

  6. [BZOJ1552] [Cerc2007] robotic sort (splay)

    Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...

  7. 【bzoj1552】[Cerc2007]robotic sort

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开的 ...

  8. 【BZOJ】1552/3506 [Cerc2007]robotic sort

    [算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...

  9. [BZOJ1552][Cerc2007]robotic sort

    [BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...

随机推荐

  1. 动手实现 React-redux(四):mapDispatchToProps

    在重构 ThemeSwitch 的时候我们发现,ThemeSwitch 除了需要 store 里面的数据以外,还需要 store 来 dispatch: ... // dispatch action ...

  2. Windows API函数大全四

    10. API之硬件与系统函数 ActivateKeyboardLayout 激活一个新的键盘布局.键盘布局定义了按键在一种物理性键盘上的位置与含义 Beep 用于生成简单的声音 CharToOem ...

  3. (转)Synopsys工具简介

    DC Ultra--Design Compiler的最高版本 在Synopsys软件中完整的综合方案的核心是DC UltraTM,对所有设计而言它也是最好级别的综合平台.DC Ultra添加了全面的数 ...

  4. Centos 6 安装python2.7.6

    centos 是自带python的.但是版本稍微旧一些.搞python开发,肯定要用新一点的稳定版.所以,要升级一下python. 先去python主站下载python的源码包:Python-2.7. ...

  5. Python3中的输入输出

    input()函数 我们可以通过Python3解释器查看Python3中input()的含义: >>> type(input) <class 'builtin_function ...

  6. this.$Message.success('提示信息') 少写了一个c 导致报错

    this.$Message.success('提示信息') 少写了一个c 导致报错 而且 $Message 输出还没显示,导致我以为是没有 $Message 对象了,其实全局对象直接调用即可

  7. ::Sleep(0)的使用

    ::Sleep(0)的使用 This function causes a thread to relinquish the remainder of its time slice and become ...

  8. QT_1

    QT概述 1.1 QT 是一个跨平台的C++图形用户界面应用程序框架 1.2 发展史: 1991奇趣科技 1.3 QT 版本:商业版.开源版 1.4 优点: 1.4.1 跨平台 1.4.2 接口简单 ...

  9. zabbix auto discovery

    1.configuration>discovery>create discovery rule ip range:192.168.43.2-254 check: http 80 2.con ...

  10. JS 手机号中间4位变星号

    一:正则方法 var str1 = '13991367972'var reg = /^(\d{3})\d*(\d{4})$/;var str2 = str1.replace(reg,'$1****$2 ...