分析:

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. Map对象以及for of的使用方法

  2. 完美实现Android的屏幕常亮功能

    笔者所在公司做的APP是股票类的,用户在查看股票报价页面的时候,往往需要开启盯盘模式,这个时候屏幕是不能黑屏的,黑屏会导致用户看不到一些关键报价涨跌,错过了买入卖出的最佳时机,就会给用户造成损失,这是 ...

  3. LeetCode 题解之 Positions of Large Groups

    1.题目描述 2.问题分析 从头遍历字符串,使用一个局部迭代器和局部变量记录该字符个数.如果个数>= 3 ,则将此时的迭代器位置和局部迭代器的位置保存到局部vector中.再将这个局部vecto ...

  4. SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据

    ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@ ...

  5. 配置jboss EAP 6.4 数据库连接超时时间

    Environment Red Hat JBoss Enterprise Application Platform (EAP) 6.x 7.x Issue Server throws followin ...

  6. 微信小程序里解决app.js onLaunch事件与小程序页面的onLoad加载前后异常问题

    使用 Promise 解决小程序页面因为需要app.js onLaunch 参数导致的请求失败 app.js onLaunch 的代码 "use strict"; Object.d ...

  7. How to add hyperlink in JLabel

    You can do this using a JLabel, but an alternative would be to style a JButton. That way, you don't ...

  8. mybatis 中的<![CDATA[ ]]>

    在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]&g ...

  9. Hexo搭建博客笔记

    Hexo搭建(建议看ppt:https://files.cnblogs.com/files/-SANG/%E4%BD%A0%E7%9A%84%E7%8C%AB.pptx ) 安装Git https:/ ...

  10. Javaweb学习(三):Servlet程序

    好了,既然开发环境已经配置好了.那么我们首先要搞定得便是servlet了,至于为什么不先去研究jsp,这是因为jsp与servlet本就是一体两面,jsp其本身经过编译.载入.转化等步骤最终会成为se ...