1507: [NOI2003]Editor

Time Limit: 5 Sec  Memory Limit: 162 MB

Submit: 4129  Solved: 1660

[Submit][Status][Discuss]

Description

Input

输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作。其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例)。 除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。 这里我们有如下假定:  MOVE操作不超过50000个,INSERT和DELETE操作的总个数不超过4000,PREV和NEXT操作的总个数不超过200000。
 所有INSERT插入的字符数之和不超过2M(1M=1024*1024),正确的输出文件长度不超过3M字节。  DELETE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作必然不会试图把光标移动到非法位置。  输入文件没有错误。 对C++选手的提示:经测试,最大的测试数据使用fstream进行输入有可能会比使用stdio慢约1秒。

Output

输出文件editor.out的每行依次对应输入文件中每条GET指令的输出。

Sample Input

15

Insert 26

abcdefghijklmnop

qrstuv wxy

Move 15

Delete 11

Move 5

Insert 1

^

Next

Insert 1

_

Next

Next

Insert 4

.\/.

Get 4

Prev

Insert 1

^

Move 0

Get 22

Sample Output

.\/.

abcde^_^f.\/.ghijklmno

和之前写过的一道省选题几乎一样【少了个翻转,简单些】

splay水过

【附上TLE,MLE,RE,WA,AC崩溃路程QAQ】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define LL long long int
  6. #define REP(i,n) for (int i = 1; i <= (n); i++)
  7. #define isr(u) (e[e[u].f].ch[1] == u)
  8. #define ls e[u].ch[0]
  9. #define rs e[u].ch[1]
  10. #define sizl(u) (e[e[u].ch[0]].siz)
  11. using namespace std;
  12. const int maxn = 1000005,maxm = 3000005,INF = 1000000000;
  13. inline int RD(){
  14. int out = 0,flag = 1; char c = getchar();
  15. while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
  16. while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
  17. return out * flag;
  18. }
  19. char cmd[105],s[maxm];
  20. int siz = 0,pos = 0,rt = 0;
  21. struct node{char c; int ch[2],f,siz;}e[maxm];
  22. inline void pup(int u) {e[u].siz = sizl(u) + 1 + e[rs].siz;}
  23. inline void spin(int u){
  24. int s = isr(u),fa = e[u].f;
  25. e[u].f = e[fa].f; if (e[fa].f) e[e[fa].f].ch[isr(fa)] = u;
  26. e[fa].ch[s] = e[u].ch[s ^ 1]; if (e[u].ch[s ^ 1]) e[e[u].ch[s ^ 1]].f = fa;
  27. e[fa].f = u; e[u].ch[s ^ 1] = fa;
  28. pup(fa); pup(u);
  29. }
  30. inline void splay(int u,int v = 0){
  31. for (; e[u].f != v; spin(u))
  32. if (e[e[u].f].f != v) spin((isr(u) ^ isr(e[u].f)) ? u : e[u].f);
  33. if (!v) rt = u;
  34. }
  35. inline void Kth(int k,int p){
  36. int u = rt;
  37. while (true){
  38. if (sizl(u) >= k) u = ls;
  39. else if (sizl(u) + 1 == k) {splay(u,p);break;}
  40. else k -= sizl(u) + 1,u = rs;
  41. }
  42. }
  43. int build(int fa,int l,int r){
  44. if (l > r) return 0;
  45. int u = ++siz; e[u].f = fa; e[u].siz = 1;
  46. int mid = l + r >> 1; e[u].c = s[mid];
  47. if (l == r) return u;
  48. e[u].ch[0] = build(u,l,mid - 1);
  49. e[u].ch[1] = build(u,mid + 1,r);
  50. pup(u);
  51. return u;
  52. }
  53. void Insert(){
  54. int n = RD(); char c;
  55. Kth(pos + 1,0); Kth(pos + 2,rt);
  56. for (int i = 1; i <= n; i++){c = getchar(); while (c < 32 || c > 126) c = getchar(); s[i] = c;}
  57. e[e[rt].ch[1]].ch[0] = build(e[rt].ch[1],1,n);
  58. pup(e[rt].ch[1]); pup(rt);
  59. }
  60. void Print(int u){
  61. if (!u) return;
  62. Print(ls); printf("%c",e[u].c); Print(rs);
  63. }
  64. void Delete(){
  65. int n = RD();
  66. Kth(pos + 1,0); Kth(pos + n + 2,rt);
  67. e[e[rt].ch[1]].ch[0] = 0;
  68. pup(e[rt].ch[1]); pup(rt);
  69. }
  70. void Get(){
  71. int n = RD();
  72. Kth(pos + 1,0); Kth(pos + n + 2,rt);
  73. Print(e[e[rt].ch[1]].ch[0]); printf("\n");
  74. }
  75. int main(){
  76. //freopen("out.txt","w",stdout);
  77. e[siz = 2].f = 1; e[rt = 1].ch[1] = siz; e[rt].siz = 2; e[siz].siz = 1;
  78. int T = RD();
  79. while (T--){
  80. scanf("%s",cmd);
  81. switch(cmd[0]){
  82. case 'M':pos = RD();break;
  83. case 'I':Insert();break;
  84. case 'D':Delete();break;
  85. case 'G':Get();break;
  86. case 'P':pos--;break;
  87. case 'N':pos++;break;
  88. default:break;
  89. }
  90. }
  91. return 0;
  92. }

BZOJ1507 [NOI2003]Editor 【splay】的更多相关文章

  1. 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay

    [bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...

  2. 【BZOJ1861】【splay】Book 书架

    Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿 ...

  3. 【POJ3481】【splay】Double Queue

    Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...

  4. HYSBZ1588 营业额统计【Splay】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4366582.html   ---by 墨染之樱花 [题目链接]http://www.lydsy ...

  5. 【Splay】例题

    营业额统计 题目背景 HNOI2002 DAY2 T2 题目描述 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger 拿出了公司 ...

  6. [luogu3391][bzoj3223]文艺平衡树【splay】

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 分析 ...

  7. 【BZOJ】1507: [NOI2003]Editor(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1507 当练splay模板了,发现wjmzbmr的splay写得异常简介,学习了.orzzzzzzzz ...

  8. [BZOJ1507] [NOI2003] Editor (splay)

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

  9. 【洛谷】3960:列队【Splay】

    P3960 列队 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

随机推荐

  1. apache+php+mysql开发环境搭建

    一.Apache       因为Apache官网只提供源代码,如果要使用必须得自己编译,这里我选择第三方安装包Apache Lounge. 进入Apachelounge官方下载地址:http://w ...

  2. (C#)原型模式—深复制与浅复制

    1.原型模式 用原型实例指定创建对象的实例,并且通过拷贝这些原型创建新的对象. *原型模式隐藏了创建对象的细节,提高了性能. *浅复制:被复制对象的所有变量都含有与原来对象相同的值,而且所有对其他对象 ...

  3. 树的层次遍历(Trees on the level,UVA 122)

    题目描述: 题目思路: 1.用结构链表来建树 2.用队列来实现层次遍历,当遍历到根节点时,将其子节点压入队列 #include <iostream> #include <cstdli ...

  4. Python3中@的作用

    可能是自己理解能力差,网上看了一大堆教程,完全没搞懂. 自己敲几行代码,终于理解是怎么回事了. #python 3.6 #!/usr/bin/env python # -*- coding:utf-8 ...

  5. ubuntu server guide 学习笔记

    1. 软件包 1.1. dpkg dpkg -l dpkg -l | grep apache2 dpkg -L ufw dpkg -S /etc/host.conf dpkg -i zip_3.0-4 ...

  6. truffle框架快速开发合约步骤

    矩阵元区块链智能合约开发指南 1 适用范围 本规范描述了矩阵元区块链系统智能合约的开发约束与规范,用以指导DAPP开发者按照本规范开发基于矩阵元区块链运行的应用. 2 术语解释 术语 术语解释 DAP ...

  7. jdk1.8新特性-Lambda表达式使用要点

    前言 在jdk1.8出来的时候看到过,没怎么了解.但是最近再看kafka和spark框架,框架示例中ava版的很多地方用到Lambda表达式,发现使用Lambda表达式代码确实简单了好多,有些例子大致 ...

  8. JS中Text节点总结

    文本节点有Text类型表示,包含的是可以找字面解释的纯文本内容.纯文本中可以包含转移后的HTML字符,但不能包含HTML代码.Text节点具有以下属性: 1.nodeType的值为3. 2.nodeN ...

  9. 基于spec评论“欢迎来怼”团队Alpha版作品

    “欢迎来怼”团队的作品是手机版博客园 1.获取此博客园app的方式——二维码 通过扫描二维码的方式下载app,这是当今比较流行的方式,适合广大手机的使用者——青少年的使用习惯. 2.点击图标,进入该a ...

  10. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...