luoguP4008 [NOI2003]文本编辑器
题意
splay维护即可
code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2000010;
int T,tot,points,root;
int fa[maxn],size[maxn];
int ch[maxn][2];
char str[maxn],s[maxn];
queue<int>pool;
inline int read()
{
char c=getchar();int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
inline void up(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
inline bool get(int x){return ch[fa[x]][1]==x;}
inline void rotate(int x)
{
int y=fa[x],z=fa[y],k=get(x),w=ch[x][k^1];
if(z)ch[z][get(y)]=x;ch[x][k^1]=y;ch[y][k]=w;
if(w)fa[w]=y;fa[y]=x;fa[x]=z;
up(y),up(x);
}
inline void splay(int x,int goal=0)
{
while(fa[x]!=goal)
{
int y=fa[x];
if(fa[y]!=goal)rotate(get(x)==get(y)?y:x);
rotate(x);
}
if(!goal)root=x;
}
inline int find(int x)
{
int now=root;
while(23333)
{
if(ch[now][0]&&x<=size[ch[now][0]])now=ch[now][0];
else if(x>size[ch[now][0]]+1)x-=size[ch[now][0]]+1,now=ch[now][1];
else return now;
}
}
inline int build(int l,int r,char* s)
{
if(l>r)return 0;
int now,mid=(l+r)>>1;
if(!pool.empty())now=pool.front(),pool.pop();
else now=++tot;
str[now]=s[mid];size[now]=1;
ch[now][0]=build(l,mid-1,s),ch[now][1]=build(mid+1,r,s);
if(ch[now][0])fa[ch[now][0]]=now;if(ch[now][1])fa[ch[now][1]]=now;
up(now);
return now;
}
inline void print(int x)
{
if(ch[x][0])print(ch[x][0]);
putchar(str[x]);
if(ch[x][1])print(ch[x][1]);
}
inline void recycle(int x)
{
if(ch[x][0])recycle(ch[x][0]);
if(ch[x][1])recycle(ch[x][1]);
pool.push(x);
fa[x]=ch[x][0]=ch[x][1]=0;
}
inline void insert()
{
int len=read();s[0]=' ';
for(int i=1;i<=len;i++)
{
s[i]=getchar();
if(s[i]=='\n'||s[i]=='\r')i--;
}
int x=find(points+1),y=find(points+2);
splay(x),splay(y,x);
int now=build(1,len,s);
ch[y][0]=now;fa[now]=y;
up(y),up(x);
}
inline void del()
{
int len=read();
int x=find(points+1),y=find(points+len+2);
splay(x),splay(y,x);
int now=ch[y][0];
recycle(now);ch[y][0]=0;
up(y),up(x);
}
inline void Get()
{
int len=read();
int x=find(points+1),y=find(points+len+2);
splay(x),splay(y,x);
print(ch[y][0]);
puts("");
}
inline void init()
{
root=++tot;str[root]='\n',size[root]=1;
int tmp=++tot;fa[tmp]=root;str[tmp]='\n',size[tmp]=1;ch[root][1]=tmp;
up(root);
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
T=read();
init();
while(T--)
{
char op[10];scanf("%s",op);
if(op[0]=='M')points=read();
if(op[0]=='I')insert();
if(op[0]=='D')del();
if(op[0]=='G')Get();
if(op[0]=='P')points--;
if(op[0]=='N')points++;
}
return 0;
}
luoguP4008 [NOI2003]文本编辑器的更多相关文章
- [NOI2003] 文本编辑器 (splay)
复制炸格式了,就不贴题面了 [NOI2003] 文本编辑器 Solution 对于光标的移动,我们只要记录一下现在在哪里就可以了 Insert操作:手动维护中序遍历结果,即每次取中点像线段树一样一样递 ...
- 洛谷 P4008 [NOI2003]文本编辑器 解题报告
P4008 [NOI2003]文本编辑器 题目描述 很久很久以前,\(DOS3.x\)的程序员们开始对 \(EDLIN\) 感到厌倦.于是,人们开始纷纷改用自己写的文本编辑器⋯⋯ 多年之后,出于偶然的 ...
- [NOI2003]文本编辑器 [Fhq Treap]
[NOI2003]文本编辑器 没啥好说的 就是个板子 #include <bits/stdc++.h> // #define int long long #define rep(a , b ...
- cogs 330. [NOI2003] 文本编辑器
★★★ 输入文件:editor2003.in 输出文件:editor2003.out 简单对比 时间限制:2 s 内存限制:128 MB [问题描述] 很久很久以前,DOS3.x的程序 ...
- luogu P4008 [NOI2003]文本编辑器 splay 块状链表
LINK:文本编辑器 这个东西感觉块状链表写细节挺多 (块状链表本来就难写 解释一下块状链表的做法:其实是一个个数组块 然后利用链表给链接起来 每个块的大小为sqrt(n). 这样插入删除的时候直接暴 ...
- NOI2003 文本编辑器editor
1507: [NOI2003]Editor Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1908 Solved: 738[Submit][Statu ...
- NOI2003 文本编辑器
练手QAQ #include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib& ...
- 题解 P4008 【[NOI2003]文本编辑器】
块状链表及其应用 思路楼上已经说的很清楚了 看代码注释 代码很丑 #include<cstdio> #include<cctype> #include<cstring&g ...
- P4008 [NOI2003]文本编辑器
思路 FHQ Treap的板子 用FHQ Treap维护中序遍历序列即可 然后数组开够! 代码 #include <cstdio> #include <cstring> #in ...
随机推荐
- Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 最小生成树
D. Shichikuji and Power Grid</centerD.> Shichikuji is the new resident deity of the South Blac ...
- 色彩缤纷的Python(改变字体颜色及样式)
色彩缤纷的python(改变字体颜色及样式) 在项目过程中,我们常常会因为输出信息的颜色与样式过于单调以至于让人在视觉上感到很杂乱,所以看下文: 在Linux终端中,使用转义序列来进行如上所述的显示, ...
- 软件工程实践2019——idea表述及组队
时间:2019-10-08 随堂 欢迎每个有想法的同学都积极参与idea表述,用心呈现你的心中所想.你心中热爱的,希望在软工实践项目中完成的项目作品.每个愿意表达idea的同学,都有一分钟时间来呈现作 ...
- React及Nextjs相关知识点小结
React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...
- 用T4生成EF框架下的DAL、IDAL、BLL、IBLL
(一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文本模板,即一种自定义规则的代码生成器.根据业务模型可生成任何 ...
- 初识Android App自动化测试框架--Unittest
1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...
- JavaScript RegExp(正则表达式) 对象
正则表达式是描述字符模式的对象.正则表达式用于在文本上执行模式匹配和“搜索和替换”功能. var patt = /JC2182/i 示例说明: /JC2182/i - 是一个正则表达式. JC2182 ...
- 前端开发HTML5——基础标签
什么是HTML? HTML是HyperText Markup Language(超文本标记语言)的简写,他不是一种编程语言,而是一种标记语言,用于告诉浏览器如何构造你的页面.“超文本”就是指页面可以包 ...
- Qt ini文件
ini文件格式 节(section) 节用方括号括起来,单独占一行,例如: [section] 键(key) 键(key)又名属性(property),单独占一行用等号连接键名和键值,例如: name ...
- Android培训准备资料之Android开发环境的搭建
Android开发环境的搭建主要分为以下四步: (1)下载JDK并安装 (2)配置JDK环境变量 (3)下载安装Android Studio (4)配置Android SDK环境变量(可执行可不执行) ...