分析:

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. H5音乐播放器【歌单列表】

    上篇详细描述了播放页歌词如何实现跟随跟单滚动,如何解析歌词,那么歌单页又是如何生成的呢,话不多说,直接上图上代码! 首先需要获取数据,具体获取数据api请转到我跟我大兄弟博客去观看学习去,同时也感谢我 ...

  2. php 去除所有空格 包括中文空格圆角空格

    有的中文的半角,圆角空格或者段落符显示为空白的.可以用正则来处理 preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/","" ...

  3. .net4.0多进程间共享内存实现通信(VB.Net)

    .net4.0新增内存共享功能,从而很方便的实现了多进程间通信. 源码下载

  4. 【Redis】Redis学习(五) Redis cluster模式详解

    一般情况下,使用主从模式加Sentinal监控就可以满足基本需求了,但是当数据量过大一个主机放不下的时候,就需要对数据进行分区,将key按照一定的规则进行计算,并将key对应的value分配到指定的R ...

  5. Intellij IDEA去除@Autowired下划线红色提示

    Intellij IDEA通过@Autowired注入的对象,在不改变配置的情况下一直有红色下划线,虽然不影响运行,但是跟小Alan一样有强迫症的肯定受不鸟. 那么怎么去除它呢? 解决方式:改变@Au ...

  6. 使用 Roslyn引擎动态编译代码

    Roslyn引擎自2014年开源至今这么久,一直没怎么了解过,虽然VS2015早就集成了它. 以前老一套的动态编译方法在 .NET Core中似乎不再支持了,很多方法都是未实现的.下面就介绍如何在.N ...

  7. tali -f 和 tail -F 之间的区别

    tail -f      等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F     等同于--follow=name  --retry ...

  8. Django之cookie&session

    cookie Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息 ...

  9. 直播内容不合规怎么办?智能AI为您解决审核难题

    背景 近些年来,视频直播快速发展,大量的直播平台如雨后春笋一般出现,但是这同样给直播内容的监管带来了巨大的挑战,一方面国家对于直播内容监管的要求日益严格,另一方面相对于文字内容的审核,多媒体内容的审核 ...

  10. Django基础必会套装

    from django.shortcuts import HttpResponse, render, redirect 1. HttpResponse('OK') --> 把字符串的OK转成二进 ...