写完维修数列 这不是水题嘛233333

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int N=5000050;
  7. int n,pos=1,ch[N][2],fa[N],size[N],root,xx,cnt;
  8. char op[15],ins[N],v[N];
  9. void push_up(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
  10. void rotate(int p){
  11. int q=fa[p],y=fa[q],f=(ch[q][1]==p);
  12. ch[q][f]=ch[p][!f],fa[ch[q][f]]=q;
  13. ch[p][!f]=q,fa[q]=p,fa[p]=y;
  14. if(y)ch[y][ch[y][1]==q]=p;
  15. push_up(q);
  16. }
  17. void splay(int x,int tp){
  18. for(int y;y=fa[x];rotate(x)){
  19. if(y==tp)break;
  20. if(fa[y]!=tp){
  21. if((ch[y][0]==x)^(ch[fa[y]][0]==y))rotate(x);
  22. else rotate(y);
  23. }
  24. }push_up(x);
  25. if(!tp)root=x;
  26. }
  27. int find(int x,int sz){
  28. if(size[ch[x][0]]+1==sz)return x;
  29. else if(size[ch[x][0]]>=sz)return find(ch[x][0],sz);
  30. else return find(ch[x][1],sz-size[ch[x][0]]-1);
  31. }
  32. int build(int l,int r,int father){
  33. if(l>r)return 0;
  34. int pos=++cnt;
  35. if(l==r){
  36. size[pos]=1;
  37. fa[pos]=father;
  38. v[pos]=ins[l];
  39. return pos;
  40. }
  41. int mid=(l+r)>>1;
  42. ch[pos][0]=build(l,mid-1,pos);
  43. fa[pos]=father;v[pos]=ins[mid];
  44. ch[pos][1]=build(mid+1,r,pos);
  45. push_up(pos);
  46. return pos;
  47. }
  48. void check(int x){
  49. if(ch[x][0])check(ch[x][0]);
  50. printf("%c",v[x]);
  51. if(ch[x][1])check(ch[x][1]);
  52. }
  53. int main(){
  54. scanf("%d",&n);
  55. root=1,size[1]=2,ch[1][0]=2,size[2]=1,fa[2]=1,cnt=2;
  56. for(int i=1;i<=n;i++){
  57. scanf("%s",op);
  58. if(op[0]=='I'){
  59. int fx=find(root,pos),fy=find(root,pos+1);
  60. splay(fx,0),splay(fy,fx);
  61. scanf("%d",&xx);
  62. for(int j=1;j<=xx;j++)
  63. while(scanf("%c",&ins[j]),ins[j]<32);
  64. ch[fy][0]=build(1,xx,fy);
  65. push_up(fy),push_up(fx);
  66. // check(root);
  67. }
  68. else if(op[0]=='M')scanf("%d",&pos),pos++;
  69. else if(op[0]=='P')pos--;
  70. else if(op[0]=='N')pos++;
  71. else if(op[0]=='D'){
  72. scanf("%d",&xx);
  73. xx=min(size[root],xx+pos+1);
  74. int fx=find(root,pos),fy=find(root,xx);
  75. splay(fx,0),splay(fy,fx);
  76. ch[fy][0]=0,push_up(fy),push_up(fx);
  77. }
  78. else{
  79. scanf("%d",&xx);
  80. int fx=find(root,pos),fy=find(root,min(pos+xx+1,size[root]));
  81. splay(fx,0),splay(fy,fx);
  82. check(ch[fy][0]),puts("");
  83. }
  84. }
  85. }

BZOJ 1507 splay的更多相关文章

  1. bzoj 1269 bzoj 1507 Splay处理文本信息

    bzoj 1269 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1269 大致思路: 用splay维护整个文本信息,splay树的中序遍历即为 ...

  2. 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题

    2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...

  3. BZOJ 1507 NOI2003 Editor Splay

    题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...

  4. BZOJ 1507 Editor

    Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它 ...

  5. bzoj 3506 && bzoj 1552 splay

    查最小值,删除,翻转... 显然splay啊... #include<iostream> #include<cstdio> #include<algorithm> ...

  6. bzoj 1014 splay维护hash值

    被后缀三人组虐了一下午,写道水题愉悦身心. 题很裸,求lcq时二分下答案就行了,写的不优美会被卡时. (写题时精神恍惚,不知不觉写了快两百行...竟然调都没调就A了...我还是继续看后缀自动机吧... ...

  7. bzoj 1503 splay

    因为是整体加减,所以直接记录在外面. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  8. bzoj 3224 splay模板题4

    再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...

  9. bzoj 3223 splay模板题3

    水题...貌似理解splay怎么维护数列了... 每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树. #include<i ...

随机推荐

  1. (转)Bootstrap 之 Metronic 模板的学习之路 - (3)源码分析之 body 部分

    https://segmentfault.com/a/1190000006697252 body 的组成结构 body 部分包含了 HEADER.CONTAINER.FOOTER,其中 CONTAIN ...

  2. (转)Arcgis for JS之对象捕捉

    http://blog.csdn.net/gisshixisheng/article/details/44098615 在web操作,如绘制或者测量的时候,为了精确,需要捕捉到某一图层的对象,在此,讲 ...

  3. The as! Operator

    Prior to Swift 1.2, the as operator could be used to carry out two different kinds of conversion, de ...

  4. web开发——在网页中引用字体包(.ttf),即嵌入特殊字体

    在写html时,有点时候需要显示一些特殊字体,不过这些特殊字体是系统一般不自带的,这时就需要我们自行加载要用的字体.方法如下: 1.首先在style里添加: @font-face { font-fam ...

  5. shell 结合expect实现ssh登录并执行命令

    #!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...

  6. noip模板复习

    自己敲模板还是有很多容易错的地方 写在注释里面了 LCA #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = ...

  7. Java 学习(8):java 方法

    Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 命名规则: 1. 必须以 字母.'_'或'$'开头. ...

  8. Spring Boot 定时任务单线程和多线程

    Spring Boot 的定时任务: 第一种:把参数配置到.properties文件中: 代码: package com.accord.task; import java.text.SimpleDat ...

  9. i=i+1,i+=1与i++的区别

    1. i=i+1 a.读取右i的地址 b,i=1 c.读取左i的地址 d. 值赋给左i 2.i+=1 a.读取左i的地址 b.i+1 c.值给i 3.i++ a.读取右i的地址 b.值加1

  10. 部署WAR包实时查看Tomcat的状态和日志

    在不重启Tomcat的情况下部署WAR包实时输出日志的方法: 注意:以下方式只适合Linux. 一.定位错误 查看Tomcat日志的尾部 tail -n 50 /opt/tomcat8/logs/ca ...