题目链接:文本编辑器

  这道题没啥好说的,直接上\(Splay\)就行了,板子题……

  但是我某个地方忘了下放标记导致调了一晚上

  听说有个东西叫\(rope\)可以直接过?然而我并不会

  保存一发板子:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
  7. #define maxn 1024*1024*2+10
  8.  
  9. using namespace std;
  10. typedef long long llg;
  11.  
  12. int m,rt,tt,now,n;
  13. int s[maxn][2],fa[maxn],siz[maxn];
  14. char ss[maxn],val[maxn];
  15. bool rev[maxn];
  16.  
  17. int getint(){
  18. int w=0;bool q=0;
  19. char c=getchar();
  20. while((c>'9'||c<'0')&&c!='-') c=getchar();
  21. if(c=='-') c=getchar(),q=1;
  22. while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
  23. return q?-w:w;
  24. }
  25.  
  26. void update(int x){siz[x]=siz[s[x][0]]+siz[s[x][1]]+1;}
  27. void rotate(int x,int &k){
  28. int p=fa[x],g=fa[p];
  29. bool l=(x==s[p][1]),r=!l;
  30. if(p==k) k=x;
  31. else s[g][p==s[g][1]]=x;
  32. fa[s[x][r]]=p; s[p][l]=s[x][r];
  33. s[x][r]=p; fa[p]=x; fa[x]=g;
  34. update(p),update(x);
  35. }
  36.  
  37. void splay(int x,int &k){
  38. while(x!=k){
  39. int p=fa[x],g=fa[p];
  40. if(p!=k){
  41. if((x==s[p][1])^(p==s[g][1])) rotate(x,k);
  42. else rotate(p,k);
  43. }
  44. rotate(x,k);
  45. }
  46. }
  47.  
  48. int find(int x){
  49. int u=rt,l,r; x++;
  50. while(u){
  51. l=s[u][0],r=s[u][1];
  52. if(rev[u]){
  53. rev[l]^=1,rev[r]^=1; rev[u]=0;
  54. swap(l,r),swap(s[u][0],s[u][1]);
  55. }
  56. if(siz[l]+1==x) break;
  57. if(siz[l]>=x) u=l;
  58. else x-=siz[l]+1,u=r;
  59. }
  60. return u;
  61. }
  62.  
  63. int split(int l,int r){
  64. splay(find(l-1),rt); splay(find(r+1),s[rt][1]);
  65. return s[s[rt][1]][0];
  66. }
  67.  
  68. int build(int l,int r){
  69. if(l>r) return 0;
  70. int u=++tt,mid=(l+r)>>1;
  71. s[u][0]=build(l,mid-1),s[u][1]=build(mid+1,r);
  72. fa[s[u][0]]=u,fa[s[u][1]]=u,val[u]=ss[mid];
  73. update(u); return u;
  74. }
  75.  
  76. int main(){
  77. File("a");
  78. m=getint(); rt=1; tt=5;
  79. s[1][0]=2; s[1][1]=3; s[3][0]=4; s[3][1]=5;
  80. fa[4]=fa[5]=3; fa[2]=fa[3]=1;
  81. for(int i=5;i;i--) update(i),val[i]=' ';
  82. while(m--){
  83. scanf("%s",ss); int u,v;
  84. if(ss[0]=='M') now=getint();
  85. else if(ss[0]=='P') now--;
  86. else if(ss[0]=='N') now++;
  87. else if(ss[0]=='G') printf("%c\n",val[find(now+1)]);
  88. else if(ss[0]=='I'){
  89. n=getint();
  90. for(int i=1;i<=n;i++) ss[i]=getchar();
  91. v=build(1,n); split(now+1,now); u=s[rt][1];
  92. s[u][0]=v; fa[v]=u; while(u) update(u),u=fa[u];
  93. }
  94. else{
  95. n=getint(); u=split(now+1,now+n);
  96. if(ss[0]=='R') rev[u]^=1;
  97. else{
  98. s[fa[u]][0]=0; fa[u]=0;
  99. update(s[rt][1]); update(rt);
  100. }
  101. }
  102. }
  103. return 0;
  104. }

BZOJ 1269 【AHOI2006】 文本编辑器的更多相关文章

  1. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  2. BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1213  Solved: 454[Submit ...

  3. bzoj 1269 [AHOI2006]文本编辑器editor

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1269 伸展树的运用,如下: #include<cstdio> #include ...

  4. 【BZOJ】1269: [AHOI2006]文本编辑器editor(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1269 这题RE2次啊,好不爽啊,我一直以为是splay的问题,其实是数组开小了......(我老犯这 ...

  5. 【BZOJ 1269】文本编辑器

    题目 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义: Move k:将 ...

  6. 1269: [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5269  Solved: 2037[Submit][Status][Discuss] Descript ...

  7. AHOI2006文本编辑器editor

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1885  Solved: 683[Submit ...

  8. BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4633  Solved: 1782 [Sub ...

  9. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor

    BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...

  10. 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay

    [BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...

随机推荐

  1. c++Template 的辨析

    1.在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 答:class用于定义类,在模板引入c++后,最初定义模板的方 ...

  2. postgresql----INSERT

    INSERT即向表中写入数据,每条INSERT语句可以写入一条数据,也可以写入多条数据.另外还可以将其他的查询结果集用在INSERT中,将查询结果写入表中. 测试表 test)); CREATE TA ...

  3. jenkins前端构建

    nginx 安装yum install nginx //输入下载 or yum install epel-release //如果上一步安装失败 yum install nginx //再次下载 配置 ...

  4. Fatal error in launcher: Unable to create process using '"c:\python37\python3.exe" "C:\Python37\Scripts\pip3.exe" install opencv-python'

    pip3.exe install opencv-python 报错: Fatal error in launcher: Unable to create process using '"c: ...

  5. redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移

    上一篇http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入.读写分离.实验自动故障切换(高可用性),那么本篇我们就来聊了聊r ...

  6. wsdl客户端代码生成的方法

    在jdk的bin目录下有一个wsimport.exe的工具,使用该工具命令生产java客户端代码: 命令如下: wsimport  -keep -d d:\ -s d:\src -p com.map  ...

  7. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

  8. mysql 数据操作 单表查询 group by 聚合函数

    强调: 如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义 多条记录之间的某个字段值相同,该字段通常用来作为分组的依据 如果按照每个字段都是唯一的进行分组,意味着按照这 ...

  9. LockSupport HotSpot里park/unpark的实现

    每个java线程都有一个Parker实例,Parker类是这样定义的: class Parker : public os::PlatformParker { private: volatile int ...

  10. Spring中基于Java的配置@Configuration和@Bean用法

    spring中为了减少xml中配置,可以声明一个配置类(例如SpringConfig)来对bean进行配置. 一.首先,需要xml中进行少量的配置来启动Java配置: <?xml version ...