题目链接:文本编辑器

  这道题没啥好说的,直接上\(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. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

  2. c# SQL Server数据库操作-管理命令参数的类:SqlParameter

    使用SqlCommand类来执行Transact-SQL语句或存储过程时,有时需要用参数传值或作为返回值,SqlParameter类正是为了此需要而设计的类.下面介绍如何使用该类为SqlCommand ...

  3. Android EditText光标颜色 与inputType

    1.EditText有一个属性:android:textCursorDrawable,这个属性是用来控制光标颜色的   android:textCursorDrawable="@null&q ...

  4. Linux系统修改编码(转)

    Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK.方法如下: 方法1: vi ...

  5. 微信小程序 --- model弹框

    model弹框:在屏幕中间弹出,让你进行选择: 效果: 代码: <button type="primary" bindtap="btnclick"> ...

  6. SQL---->mySQl数据库1------jdbc简单入门

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 目的:不用学习每个数据库的驱动,学 ...

  7. Qt::浅谈信号槽连接,参数在多线程中的使用

    Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Q ...

  8. Day21 过滤器(Filter)

    day21     过滤器(Filter) 过滤器概述   1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个 ...

  9. nodejs Async详解之三:集合操作

    Async提供了很多针对集合的函数,可以简化我们对集合进行异步操作时的步骤.如下: forEach:对集合中每个元素进行异步操作 map:对集合中的每个元素通过异步操作得到另一个值,得到新的集合 fi ...

  10. 【开发者笔记】C#连接mysql问题记录

    1.概述:C#在调用mysql.data.dll连接本地数据库时报错,连接远程Linux服务器上的mysql服务器正常 2.报错记录,当前连接字符串 <add key="dbStrin ...