BZOJ1269——[AHOI2006]文本编辑器editor
1、题意:各种splay操作,一道好的模板题2333
2、分析:splay模板题,没啥解释QAQ
#include <stack> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define M 2000010 inline int read(){ char ch = getchar(); int x = 0, f = 1; while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while('0' <= ch && ch <= '9'){ x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } namespace splay{ struct Node{ Node *ch[2], *fa; char c; bool rev; int size; inline int which(); inline void reverse(){ rev ^= 1; swap(ch[0], ch[1]); } inline void pd(){ if(rev){ ch[0] -> reverse(); ch[1] -> reverse(); rev = false; } } inline void maintain(){ size = 1 + ch[0] -> size + ch[1] -> size; } Node(); } *null = new Node, ft[M]; int tot; Node::Node(){ size = 1; c = '\0'; ch[0] = ch[1] = fa = null; rev = false; } inline int Node::which(){ if(fa == null) return -1; return this == fa -> ch[1]; } inline void rotate(Node *o){ Node *p = o -> fa; int l = o -> which(), r = l ^ 1; o -> fa = p -> fa; if(p -> which() != -1) p -> fa -> ch[p -> which()] = o; p -> ch[l] = o -> ch[r]; if(o -> ch[r]) o -> ch[r] -> fa = p; o -> ch[r] = p; p -> fa = o; o -> ch[r] -> maintain(); o -> maintain(); } inline void splay(Node *o){ static stack<Node*> st; if(!o) return; Node *p = o; while(1){ st.push(p); if(p -> which() == -1) break; p = p -> fa; } while(!st.empty()){ st.top() -> pd(); st.pop(); } while(o -> which() != -1){ p = o -> fa; if(p -> which() != -1){ if(p -> which() ^ o -> which()) rotate(o); else rotate(p); } rotate(o); } } inline Node* Kth(Node *o, int k){ o -> pd(); int t = o -> ch[0] -> size + 1; if(k == t) return o; if(k < t) return Kth(o -> ch[0], k); return Kth(o -> ch[1], k - t); } inline Node *merge(Node *a, Node *b){ if(a == null) return b; if(b == null) return a; Node *p = Kth(a, a -> size); splay(p); Node *c = p; c -> ch[1] = b; b -> fa = c; c -> maintain(); return c; } inline void split(Node *o, int k, Node* &a, Node* &b){ if(k == 0){ a = null; b = o; return; } if(k == o -> size){ a = o; b = null; return; } Node *p = Kth(o, k); splay(p); o = p; o -> maintain(); b = p -> ch[1]; b -> fa = null; p -> ch[1] = null; a = p; a -> maintain(); } } using namespace splay; int main(){ null -> ch[0] = null -> ch[1] = null -> fa = null; null -> c = '\0'; null -> rev = false; null -> size = 0; int n = read(); int now = 0; Node *root = null; char str[10]; for(int i = 1; i <= n; i ++){ scanf("%s", str); if(str[0] == 'M'){ int x = read(); now = x; } else if(str[0] == 'I'){ int x = read(); Node *a, *b, *d = null; split(root, now, a, b); for(int i = 1; i <= x; i ++){ char ch = getchar(); Node *c = &ft[++ tot]; c -> c = ch; d = merge(d, c); } root = merge(a, d); root = merge(root, b); } else if(str[0] == 'D'){ int x = read(); Node *a, *b, *c; split(root, now, a, b); split(b, x, b, c); root = merge(a, c); } else if(str[0] == 'R'){ int x = read(); Node *a, *b, *c; split(root, now, a, b); split(b, x, b, c); b -> reverse(); root = merge(a, b); root = merge(root, c); } else if(str[0] == 'G'){ Node *p = Kth(root, now + 1); printf("%c\n", p -> c); } else if(str[0] == 'P'){ now --; } else{ now ++; } } return 0; }
BZOJ1269——[AHOI2006]文本编辑器editor的更多相关文章
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ...
- [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或 ...
- Bzoj1269 [AHOI2006]文本编辑器editor
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3678 Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可正 ...
- [BZOJ1269] [AHOI2006] 文本编辑器editor (splay)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或多 ...
- 【rope】bzoj1269 [AHOI2006]文本编辑器editor
维护一个字符串,支持以下操作: 主要就是 成段插入.成段删除.成段翻转.前两个操作很好通过rope实现.第三个操作也不难,维护两个rope,一个正向,一个反向,翻转时swap一下就行了. ro ...
- 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay
[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...
- AHOI2006文本编辑器editor
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1885 Solved: 683[Submit ...
- BZOJ 1269: [AHOI2006]文本编辑器editor( splay )
splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
随机推荐
- jQuery获取margin-top和padding-top的值
var bordT = $('img').outerWidth() - $('img').innerWidth(); var paddT = $('img').innerWidth() - $('i ...
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- Python小白的发展之路之Python基础(一)
Python基础部分1: 1.Python简介 2.Python 2 or 3,两者的主要区别 3.Python解释器 4.安装Python 5.第一个Python程序 Hello World 6.P ...
- JS倒计时执行操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Azure AD Connect 手动同步
我们目前采用工具Azure AD Connect 目录同步工具将本地域控制器的用户信息同步至office365和Azure 在之前目录同步工具中使用Windows 任务计划程序或单独的 Windows ...
- python--django项目如何设置用自己的iP地址访问项目
一.首先需要执行>manage.py runserver 0.0.0.0:8000. 二.在setting.py里面需要添加ALLOWED_HOSTS="*".
- Scala元组
object TupleTest { def basic(firstName: String, lastName: String, age: Int): (String, String, Int) = ...
- bootstrap兼容性问题
转自--http://blog.csdn.net/chenhongwu666/article/details/41513901/ 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstr ...
- css-css权威指南学习笔记6
第八章 padding/border/margin 1.对于只包含文本的行,能改变行间距里的属性只有line-height/font-size/vertical-align. 2.对行内非替换元素应用 ...
- JS for循环
正常的for循环代码: var arr = ['Apple', 'Google', 'Microsoft']; var i, x; for (i=0; i<arr.length; i++) { ...