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 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
随机推荐
- ngx_http_fastcgi_module模块.md
ngx_http_fastcgi_module ngx_http_fastcgi_module模块允许将请求传递到FastCGI服务器. fastcgi_bind Syntax: fastcgi_bi ...
- js 批量设置css样式
在js中更换样式比较常见,但是批量设置比较少遇见: 但是在做就是插件时,不想额外的添加css文件(需要导入,还可能引起冲突),能批量设置就比较方便了. 以下代码是来自网上的三种方法,使用第二种最方便了 ...
- [LeetCode] Total Hamming Distance 全部汉明距离
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [LeetCode] Integer to English Words 整数转为英文单词
Convert a non-negative integer to its english words representation. Given input is guaranteed to be ...
- ASP.NET MVC VS2010中更改默认调试浏览器
在Visual Studio 2010(RC)中右键点击 .aspx 页面已不复存在"browse with"菜单项.那要如何修改调试时使用的默认浏览器呢? 默认情况下,VS会使用 ...
- 1001 数组中和等于K的数对 1090 3个数和为0
二分查找.对数组每个V[i],在其中查找K-V[i],查找完成后修改v[i]避免重复输出 #include<iostream> #include<algorithm> #inc ...
- laravel下的数据序列化
$data=$this->user->get(); //is obj $data=(string)$data; //is string $data=$data->toArray(); ...
- 用EmEditor实现PDF转Word后的对齐排版
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率 //去除所有空行和只由空白字符构成的行 documen ...
- 多线程异步导出excel
先新建一个执行类 @Service public class MultiService { private static final Logger logger = LoggerFactory.get ...
- easyui与ueditor合用问题
在联合使用easyui与ueditor的时候,当在dialog中通过href打开一个页面,页面中含有ueditor,如果使用dialog的close方法,可以理解为只是将dialog给隐藏了,再将点击 ...