分析:

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的更多相关文章

  1. 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay

    [bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...

  2. 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay

    [BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...

  3. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor

    BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...

  4. BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4633  Solved: 1782 [Sub ...

  5. AHOI2006文本编辑器editor

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1885  Solved: 683[Submit ...

  6. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  7. BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1213  Solved: 454[Submit ...

  8. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

  9. Bzoj1269 [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3678  Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可正 ...

随机推荐

  1. 【代码笔记】iOS-手机版本号,机型,操作系统版本,设备唯一标识符

    一,代码. RootViewController.m #import "ViewController.h" #import "sys/utsname.h" @i ...

  2. 过滤器(Filter)与拦截器(Interceptor)的区别

    1 .拦截器是基于java的反射机制的,而过滤器是基于函数回调. 2 .拦截器不依赖与servlet容器,过滤器依赖与servlet容器. 3 .拦截器只能对action请求起作用,而过滤器则可以对几 ...

  3. 关于css样式文件和less的文件的比较说明

    1.css文件 css文件主要的用途是对网页中字体.颜色.背景.图像及其他各种元素的控制,使网页能够完全按照设计者的要求来显示.相信大家都对css比较了解了,再次不作过多说明. 2.less文件 Le ...

  4. Android学习 -- Activity 以及Activity之间值传递

    项目结构如图 关键代码如下 strings.xml文件代码如下: <?xml version="1.0" encoding="utf-8"?> &l ...

  5. Django 序列化三种方式 对象 列表 元组

    1.xuliehua.html <html lang="en"> <head> <meta charset="UTF-8"> ...

  6. 学习ASP.NET之旅

    1.HTML 2.DIV 3.CSS 4.JS脚本 5.javascript 6.J-Query 7.AJAX 8.c# 9.IIS配置 10.ASP.NET怎样添加控件,与winform的控件添加方 ...

  7. [Errno 256] No more mirrors to try 解决方法

    安装tree时遇到问题yum [Errno 256] No more mirrors to try 解决方法: 1.yum clean all 2.yum makecache 3.yum update ...

  8. MSChart 设置饼图颜色 图例背景色 图例显示位置

    chartField.Series.Clear();            chartField.ChartAreas.Clear();            chartField.Legends.C ...

  9. November 11th, 2017 Week 45th Saturday

    Happiness is a direction, not a place. 快乐是一个方向,不是一个目的. Do you remember those moments in your life wh ...

  10. [BZOJ 1135][POI2009]Lyz

    [BZOJ 1135][POI2009]Lyz 题意 初始时滑冰俱乐部有 \(1\) 到 \(n\) 号的溜冰鞋各 \(k\) 双.已知 \(x\) 号脚的人可以穿 \(x\) 到 \(x+d\) 的 ...