题目链接:文本编辑器

  这道题没啥好说的,直接上\(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. postgresql数据库中对重复数据的处理

    我们在使用postgresql数据库的时候,如果一张数据表在未做任何约束的情况下,很可能会出现几条完全一样的数据,即重复数据.如下图所示: 那么如果我们要删除其中的2条该怎么办呢?第一种我们可以清空表 ...

  2. mysql日期处在某两个时间段之间的between比较

    where SYSDATE() between '2018-08-28 09:21:48' and '2018-08-28 09:25:48' sysdate()等于2018-08-28 09:23: ...

  3. 边的双联通+缩点+LCA(HDU3686)

    Traffic Real Time Query System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. Python中协程Event()函数

    python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait.clear.set 事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 e ...

  5. <bean> 中配置详解 </bean>

    <bean> ***</bean> 这叫做Spring的依赖注入也叫控制反转.bean的id也就是你说的bean的id,通过id找你想要调用的bean <bean id= ...

  6. 【巷子】---vue项目打包---基本使用---【vue】

    一.基本设置 二.打包 npm run build 三.github创建一个仓库 1.将文件上传至仓库 2.点击仓库设置 3.选择代码上传到master 4.点击地址即可预览 5.常用技巧 a.如果在 ...

  7. Flum入门必备知识

    1.flume概念 flume是分布式的,可靠的,高可用的,用于对不同来源的大量的日志数据进行有效收集.聚集和移动,并以集中式的数据存储的系统. flume目前是apache的一个顶级项目. flum ...

  8. centos7yum下载安装报:软件包与预期下载的不符。建议:运行 yum --enablerepo=updates clean metadata尝试其他镜像

    centos7yum下载安装报:软件包与预期下载的不符.建议:运行 yum --enablerepo=updates clean metadata尝试其他镜像. rm -f /var/lib/rpm/ ...

  9. rac数据库单连接报错ora-12537解决办法

    1.现象如下: C:\Users\Administrator.DBA-PC>sqlplus sys/oracle@192.168.100.33:1521/orcl as sys dba SQL* ...

  10. Ensure Indexes Fit in RAM

    Ensure Indexes Fit in RAM — MongoDB Manual https://docs.mongodb.com/manual/tutorial/ensure-indexes-f ...