[NOI2003]Editor & [AHOI2006]文本编辑器editor BZOJ1507&BZOJ1269
分析:
Splay区间操作裸题,维护出区间信息,按照要求模拟,注意读入格式,并且考虑内存回收(开不下)
附上代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <map>
using namespace std;
#define N 2097200
#define ls ch[rt][0]
#define rs ch[rt][1]
#define get(rt) (ch[f[rt]][0]!=rt)
int ch[N][2],f[N],cnt,siz[N],val[N],S[N],top,rot,pos,size,rev[N];char op[20],s[N];
void clear(int rt)
{
rev[rt]=ch[rt][0]=ch[rt][1]=f[rt]=siz[rt]=val[rt]=0;
}
void PushUp(int rt)
{
if(rt)siz[rt]=siz[ls]+siz[rs]+1;
}
void PushDown(int rt)
{
if(rev[rt])
{
if(ls)rev[ls]^=1,swap(ch[ls][0],ch[ls][1]);
if(rs)rev[rs]^=1,swap(ch[rs][0],ch[rs][1]);
rev[rt]=0;
}
}
int new_node()
{
int rt;
if(top)rt=S[--top];
else rt=++cnt;
clear(rt);
return rt;
}
void rotate(int rt)
{
int x=f[rt],y=f[x],k=get(rt);
if(y)ch[y][ch[y][0]!=x]=rt;
ch[x][k]=ch[rt][!k];f[ch[x][k]]=x;
ch[rt][!k]=x;f[x]=rt;f[rt]=y;
if(rot==x)rot=rt;PushUp(x);PushUp(rt);
}
void Splay(int rt,int y)
{
for(int fa;(fa=f[rt])!=y;rotate(rt))
if(f[fa]!=y)
rotate((get(fa)==get(rt))?fa:rt);
}
void build(int fa,int l,int r,bool flg)
{
if(l>r)return ;
int m=(l+r)>>1,rt=new_node();
val[rt]=s[m];ch[fa][flg]=rt;f[rt]=fa;
build(rt,l,m-1,0);build(rt,m+1,r,1);PushUp(rt);
}
int find(int x)
{
int rt=rot;
while(1)
{
PushDown(rt);
if(siz[ls]>=x)rt=ls;
else
{
x-=siz[ls]+1;
if(!x)return rt;
rt=rs;
}
}
}
void rec(int rt)
{
if(!rt)return ;
if(ls)rec(ls);ls=0;if(rs)rec(rs);rs=0;
clear(rt);S[top++]=rt;
}
void insert(int len)
{
int x=find(pos),rt=find(pos+1);Splay(x,0);Splay(rt,rot);
build(rt,1,len,0);PushUp(rt);PushUp(x);
}
void del(int len)
{
int x=find(pos),rt=find(pos+len+1);Splay(x,0);Splay(rt,rot);
rec(ls);ls=0;PushUp(rt);PushUp(x);
}
void reverse(int len)
{
int x=find(pos),y=find(pos+len+1);Splay(x,0);Splay(y,rot);
int rt=ch[y][0];swap(ls,rs);rev[rt]^=1;
}
int main()
{
int Q;
scanf("%d",&Q);
siz[1]=2,siz[2]=1,ch[1][1]=2,f[2]=1,rot=pos=1,size=cnt=2;
while(Q--)
{
int x;
scanf("%s",op);
if(op[0]=='M')scanf("%d",&x),pos=x+1;
else if(op[0]=='I')
{
scanf("%d",&x);
for(int i=1;i<=x;i++)
{
s[i]=getchar();
while(s[i]>126||s[i]<32)s[i]=getchar();
}
s[x+1]='\0';
//printf("%s",s+1);
insert(x);size+=x;
}else if(op[0]=='D')
{
scanf("%d",&x);
if(x+pos+1>size)x=size-pos-1;
del(x);size-=x;
}else if(op[0]=='N')pos+=(pos!=size);
else if(op[0]=='P')pos-=(pos>0);
else if(op[0]=='G')
{
int y=find(pos),rt=find(pos+2);
Splay(y,0);Splay(rt,rot);
printf("%c\n",val[ls]);
}else
{
scanf("%d",&x);
if(x+pos+1>size)x=size-pos-1;
reverse(x);
}
}
return 0;
}
[NOI2003]Editor & [AHOI2006]文本编辑器editor BZOJ1507&BZOJ1269的更多相关文章
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...
- 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay
[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...
- BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ...
- 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 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
- BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1213 Solved: 454[Submit ...
- [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 这些日子,可可不和卡卡一起玩了,原来可可正 ...
随机推荐
- 安装vs2008出现MSI returned error code 1603的错误的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 在win7 64位旗舰版上安装vs2008 ,一直停留在下面页面: 最后错误日志是: [12/12/16,15:39: ...
- C语言中数据类型的本质
数据类型可以理解为固定内存大小的别名.比如int类型,就是表示占用4字节的内存. 1 数据类型的大小 用sizeof操作符获得数据类型的大小. 比如 int a[5]; sizeof(a)就可以得 ...
- Python+Selenium笔记(二):配置谷歌+IE环境
#有的时候可能要访问外国的网站下载资料或工具,这时可能出现各种问题,例如谷歌人机验证显示不了.网站打不开等,建议使用一个FQ软件 (一) 设置IE (1) http://docs.seleniu ...
- 【three.js练习程序】随机生成100个方块
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 团队项目第二阶段个人进展——Day1
一.昨天工作总结 冲刺第一天,查看了第一阶段的代码 二.遇到的问题 写个的代码发现看不懂了 三.今日工作规划 重新设计页面布局
- 【SPL标准库专题(4)】 Datastructures:SplDoublyLinkedList
简述 双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址. 类摘要 SplDoublyLinkedList implements Iterato ...
- INNODB insert buffer 简单分析
在mysql5.1 之前称为Insert Buffer, 优化2级非唯一索引上插入操作的读IO, 在5.5之后改名为Change Buffer, 功能也扩展为2级非唯一索引上的插入.删除.更新.pur ...
- sql server 2008 身份验证失败 18456
双击打开后加上 ;-m 然后以管理员方式 打开 SQLSERVER 2008 就可以已window身份登录 不过还没有完 右键 属性 =>安全性 更改为 sql server 和 ...
- centos7 安装 jdk1.8
首先是Linux的不同版本的额系统自带的配置是不一样的,比如centos6上有的自带的jdk环境的话要装1.8的就要进行卸载或者马上进行更改 jdk是java程序依赖的环境 首先查看你的系统下是否有j ...
- 快速开发QCombox以及业务样式自定义
这是我在项目实战中的个人总结,写的仓促,有些东西也不一定准确,有些是自己推断的,还希望各位多多指教,多多评论. 关于QCombox如果不需要自定义,其实写UI是很简单的. 创建实例:QComboBox ...