题目链接:文本编辑器

  这道题没啥好说的,直接上\(Splay\)就行了,板子题……

  但是我某个地方忘了下放标记导致调了一晚上

  听说有个东西叫\(rope\)可以直接过?然而我并不会

  保存一发板子:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1024*1024*2+10 using namespace std;
typedef long long llg; int m,rt,tt,now,n;
int s[maxn][2],fa[maxn],siz[maxn];
char ss[maxn],val[maxn];
bool rev[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void update(int x){siz[x]=siz[s[x][0]]+siz[s[x][1]]+1;}
void rotate(int x,int &k){
int p=fa[x],g=fa[p];
bool l=(x==s[p][1]),r=!l;
if(p==k) k=x;
else s[g][p==s[g][1]]=x;
fa[s[x][r]]=p; s[p][l]=s[x][r];
s[x][r]=p; fa[p]=x; fa[x]=g;
update(p),update(x);
} void splay(int x,int &k){
while(x!=k){
int p=fa[x],g=fa[p];
if(p!=k){
if((x==s[p][1])^(p==s[g][1])) rotate(x,k);
else rotate(p,k);
}
rotate(x,k);
}
} int find(int x){
int u=rt,l,r; x++;
while(u){
l=s[u][0],r=s[u][1];
if(rev[u]){
rev[l]^=1,rev[r]^=1; rev[u]=0;
swap(l,r),swap(s[u][0],s[u][1]);
}
if(siz[l]+1==x) break;
if(siz[l]>=x) u=l;
else x-=siz[l]+1,u=r;
}
return u;
} int split(int l,int r){
splay(find(l-1),rt); splay(find(r+1),s[rt][1]);
return s[s[rt][1]][0];
} int build(int l,int r){
if(l>r) return 0;
int u=++tt,mid=(l+r)>>1;
s[u][0]=build(l,mid-1),s[u][1]=build(mid+1,r);
fa[s[u][0]]=u,fa[s[u][1]]=u,val[u]=ss[mid];
update(u); return u;
} int main(){
File("a");
m=getint(); rt=1; tt=5;
s[1][0]=2; s[1][1]=3; s[3][0]=4; s[3][1]=5;
fa[4]=fa[5]=3; fa[2]=fa[3]=1;
for(int i=5;i;i--) update(i),val[i]=' ';
while(m--){
scanf("%s",ss); int u,v;
if(ss[0]=='M') now=getint();
else if(ss[0]=='P') now--;
else if(ss[0]=='N') now++;
else if(ss[0]=='G') printf("%c\n",val[find(now+1)]);
else if(ss[0]=='I'){
n=getint();
for(int i=1;i<=n;i++) ss[i]=getchar();
v=build(1,n); split(now+1,now); u=s[rt][1];
s[u][0]=v; fa[v]=u; while(u) update(u),u=fa[u];
}
else{
n=getint(); u=split(now+1,now+n);
if(ss[0]=='R') rev[u]^=1;
else{
s[fa[u]][0]=0; fa[u]=0;
update(s[rt][1]); update(rt);
}
}
}
return 0;
}

BZOJ 1269 【AHOI2006】 文本编辑器的更多相关文章

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

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

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

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

  3. bzoj 1269 [AHOI2006]文本编辑器editor

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1269 伸展树的运用,如下: #include<cstdio> #include ...

  4. 【BZOJ】1269: [AHOI2006]文本编辑器editor(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1269 这题RE2次啊,好不爽啊,我一直以为是splay的问题,其实是数组开小了......(我老犯这 ...

  5. 【BZOJ 1269】文本编辑器

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

  6. 1269: [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5269  Solved: 2037[Submit][Status][Discuss] Descript ...

  7. AHOI2006文本编辑器editor

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

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

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

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

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

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

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

随机推荐

  1. 【Android】ImageMap,图片地图

    https://github.com/CFutureTeam/android-image-map package com.*.imagemap; import *.imagemap.ImageMap; ...

  2. android选择图片或拍照图片上传到服务器(包括上传参数)

    From:http://blog.csdn.net/springsky_/article/details/8213898具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 [java ...

  3. 移动端开发--rem和像素如何使用!

    刚开始做移动端的开发的时候,大多时候是在使用 像素(PX)来写页面和布局的,但是使用下来,还是有多少不好用! 随之就开始用 rem 来写,rem写的结果是页面放到一些屏幕上,字体过小,如果页面渲染用了 ...

  4. 交换机工作原理、MAC地址表、路由器工作原理详解

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  5. Redis快速起步及Redis常用命令大全

    本系列教程内容提要 Java工程师之Redis实战系列教程教程是一个学习教程,是关于Java工程师的Redis知识的实战系列教程,本系列教程均以解决特定问题为目标,使用Redis快速解决在实际生产中的 ...

  6. 常用linq语法

    1.简单的linq语法 var ss = from r in db.Am_recProScheme select r; var ss1 = db.Am_recProScheme; string sss ...

  7. __devexit_p的功能

    看驱动的时候,时常会有如下代码: .remove = __devexit_p(XX_exit), 这里的__devexit_p有什么作用呢? 我在include/linux/init.h中找到了它的定 ...

  8. mysql线上负载高怎么排查

    作为一个开发人员或者数据库管理员,学会检查数据库运行情况是必不可少的工作.造成MySQL线程卡顿的原因有很多,但是无论是哪种原因,我们发现问题之后的第一要务就是解决问题,防止问题继续恶化.那么,应该如 ...

  9. curl 模拟GET\POST请求,以及curl post上传文件

    https://blog.csdn.net/fungleo/article/details/80703365

  10. 双态运维分享之:业务场景驱动的服务型CMDB

    最近这几年,国内外CMDB失败的案例比比皆是,成功的寥寥可数,有人质疑CMDB is dead?但各种业务场景表明,当下数据中心运维,CMDB依然是不可或缺的一部分,它承载着运维的基础,掌握运维的命脉 ...