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 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
随机推荐
- Python mock
在测试过程中,为了更好地展开单元测试,mock一些数据跟对象在所难免,下面讲一下python的mock的简单用法. 关于python mock,网上有很多资料,这里不会讲的特别深,但一定会是实用为主, ...
- virtualBox安装Centos7之后
之前用vmware装虚拟机的时候,直接配置好网卡就可以ping通,可以用ssh登录,然后配置yum源,万事大吉. 但是virtualBox配置却有不同,需要按下面的方法配置: 选中虚拟机->设置 ...
- [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...
- 20145215&20145307《信息安全系统设计基础》实验二 固件设计
20145215&20145307<信息安全系统设计基础>实验二 固件设计 实验目的与要求 了解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux ...
- anaconda
python 集成环境 anaconda的使用 https://www.zhihu.com/question/35757251
- asp.net mvc4 简单的服务器监控开发之C#获取服务器CPU、RAM、TCP等系统信息(上)
一.背景 前段时间服务器出了点问题,加上学业愈来愈紧张,写博文分享的时间越来越少.虽然不是第一次在博客园上写经验,但是近期分享的博文得到了不少的朋友支持和指正,在这里内心非常感激和开心.希望以后能认真 ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- Shiro-集成Spring
集成Spring 加入Spring 和Shiro的jar 包 配置Spring 及SpringMVC 参照:1.3.2\shiro-root-1.3.2-source-release\shiro-ro ...
- iOS 10.0适配之旅
1.升级Xcode体验 升级到Xcode之后,调试程序好多东西都不是太适应 控制台莫名给你打印一堆不是太好理解的东西 之前使用 Alcatraz 下载的插件都不能用(如何使用Alcatraz) 打开麦 ...
- PHP日志记录规范PSR-3
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...