博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1507 [NOI2003]Editor
阅读量:5098 次
发布时间:2019-06-13

本文共 4390 字,大约阅读时间需要 14 分钟。

是一道裸的Splay(反正我不会Splay,快嘲笑我!)

只需要维护在数列上加点删点操作即可,不会写Splay的渣渣只好Orz iwtwiioi大神一下了。(后来发现程序直接抄来了。。。)

就当我的第一个Splay程序吧。

 

1 /**************************************************************  2     Problem: 1507  3     User: rausen  4     Language: C++  5     Result: Accepted  6     Time:2560 ms  7     Memory:43860 kb  8 ****************************************************************/  9   10 #include 
11 #include
12 13 using namespace std; 14 char strI[1500000]; 15 16 struct Splay{ 17 struct node{ 18 node *son[2], *fa; 19 char key; 20 int size; 21 node(){ 22 son[0] = son[1] = fa = NULL; 23 size = key = 0; 24 } 25 void pushup(){ 26 size = son[0] -> size + son[1] -> size + 1; 27 } 28 29 bool d(){ 30 return this == fa -> son[1]; 31 } 32 33 void setc(node *c, int d){ 34 son[d] = c; 35 c -> fa = this; 36 } 37 } * null, *root; 38 39 Splay(){ 40 null = new node; 41 root = null; 42 root = newnode(0); 43 node *t = newnode(0); 44 root -> setc(t, 1); 45 root -> pushup(); 46 } 47 48 node *newnode(char K){ 49 node *res = new node; 50 res -> son[0] = res -> son[1] = res -> fa = null; 51 res -> key = K, res -> size = 1; 52 return res; 53 } 54 55 void rotate(node *r){ 56 node *fa = r -> fa; 57 bool d = r -> d(); 58 fa -> fa -> setc(r, fa -> d()); 59 fa -> setc(r -> son[!d], d); 60 r -> setc(fa, !d); 61 fa -> pushup(); 62 if (fa == root) root = r; 63 } 64 65 void splay(node *r, node *X){ 66 while (r -> fa != X){ 67 if (r -> fa -> fa == X) rotate(r); 68 else r -> d() == r -> fa -> d() ? (rotate(r -> fa), rotate(r)) : (rotate(r), rotate(r)); 69 } 70 r -> pushup(); 71 } 72 73 node *sel(int k){ 74 int s; 75 for(node *t = root; ;){ 76 s = t -> son[0] -> size; 77 if (s == k) return t; 78 t = t -> son[k > s]; 79 if (k > s) k -= s + 1; 80 } 81 } 82 83 node *getrange(int l, int r){ 84 node *left = sel(l); splay(left, null); 85 node *right = sel(r); splay(right, left); 86 return right; 87 } 88 89 void insert(int w, int cur){ 90 node *t = getrange(w, w + 1); 91 t -> setc(build(0, cur), 0); 92 t -> pushup(); 93 splay(t, null); 94 } 95 96 void remove(int w, int n){ 97 node *t = getrange(w, w + n + 1); 98 t -> setc(null, 0); 99 t -> pushup();100 splay(t, null);101 }102 103 node *build(int l, int r){104 if (l >= r) return null;105 int m = (l + r) >> 1;106 node *t = newnode(strI[m]);107 t -> setc(build(l, m), 0);108 t -> setc(build(m + 1, r), 1);109 t -> pushup();110 return t;111 }112 113 void print(node *r){114 if (r == null) return;115 print(r -> son[0]);116 printf("%c", r -> key);117 print(r -> son[1]);118 }119 120 void print(int w, int n){121 node *t = getrange(w, w + n + 1);122 print(t -> son[0]);123 printf("\n");124 }125 } splay;126 127 char s[10];128 129 int main(){130 int n, T, cur, w = 0;131 scanf("%d", &T);132 while (T--){133 scanf("%s", s);134 if (s[0] == 'M')135 scanf("%d", &w);136 else if (s[0] == 'P')137 --w;138 else if (s[0] == 'N')139 ++w;140 else if (s[0] == 'D'){141 scanf("%d", &n);142 splay.remove(w, n);143 } else144 if (s[0] == 'G'){ 145 scanf("%d", &n);146 splay.print(w, n);147 } else148 if (s[0] = 'I'){149 scanf("%d", &n);150 cur = 0;151 while (n--){152 while(strI[cur] = getchar(), strI[cur] == '\n');153 cur++;154 }155 splay.insert(w, cur);156 }157 }158 return 0;159 }
View Code

 

转载于:https://www.cnblogs.com/rausen/p/4000400.html

你可能感兴趣的文章
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
Hmailserver搭建邮件服务器
查看>>
django之多表查询-2
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径
查看>>