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 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
随机推荐
- javascript深入理解js闭包
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- (原创)使用VMware安装Ubuntu,怎么无法使用startx进入桌面模式?
最近在VMware中安装Ubuntu时,发现VMware的快速安装后是文本模式,无法使用startx进入桌面模式,非常不方便.此问题为默认安装方式,需要设置安装方式. 操作系统:Windows 8.1 ...
- MySQL种种
mysql中You can't specify target table for update in FROM clause错误--http://blog.csdn.net/priestmoon/ar ...
- zabbix利用api批量添加item,并且批量配置添加graph
关于zabbix的API见,zabbixAPI 1item批量添加 我是根据我这边的具体情况来做的,本来想在模板里面添加item,但是看了看API不支持,只是支持在host里面添加,所以我先在一个ho ...
- iOS - 消息转发处理
详细运行时基础 NSInvocation介绍 NSHipster-Swizzling Objective-C Method相关方法分析 Type Encodings Objc是OOP,所以有多态. 当 ...
- spring-mvc注解(mvc:annotation-driver,JSON,配置详解)
一.DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 的使用已经过时! spring 3.1 开始我们应该用 Reque ...
- python的错误和异常
python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ...
- MSSQLServer中组织或分类表的设计及其递归查询
开篇:项目中用到上下级从属关系的太多太多了,如:组织.分类.行政区域,这里不再一一介绍,遇到这种的如何去进行数据库表的设计及其应用的,个人对往期项目中所涉及到的进行了一些总结. 数据库表设计:表字段一 ...
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ...
- selenium 等待页面加载完成
一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...