BZOJ1507 [NOI2003]Editor
BZOJ1507 [NOI2003]Editor
Description
Input
Output
每行依次对应输入文件中每条GET指令的输出。
Sample Input
Insert 26
abcdefghijklmnop
qrstuv wxy
Move 15
Delete 11
Move 5
Insert 1
^
Next
Insert 1
_
Next
Next
Insert 4
.\/.
Get 4
Prev
Insert 1
^
Move 0
Get 22
Sample Output
abcde^_^f.\/.ghijklmno
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#define MAXN 3000010
using namespace std;
queue<int> point;
int mouse=0,root=0,size=0;
char val[MAXN];
struct node{int f,s,son[2];char v;
}a[MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline void clean(int rt){a[rt].son[0]=a[rt].son[1]=a[rt].f=a[rt].s=a[rt].v=0;
}
inline void pushup(int rt){if(!rt)return;a[rt].s=1;if(a[rt].son[0])a[rt].s+=a[a[rt].son[0]].s;if(a[rt].son[1])a[rt].s+=a[a[rt].son[1]].s;
}
inline void turn(int rt,int k){int x=a[rt].f,y=a[x].f;a[x].son[k^1]=a[rt].son[k];if(a[rt].son[k])a[a[rt].son[k]].f=x;a[rt].f=y;if(y)a[y].son[a[y].son[1]==x]=rt;a[x].f=rt;a[rt].son[k]=x;pushup(x);pushup(rt);
}
void splay(int rt,int ancestry){while(a[rt].f!=ancestry){int x=a[rt].f,y=a[x].f;if(y==ancestry)turn(rt,a[x].son[0]==rt);else{int k=a[y].son[0]==x?1:0;if(a[x].son[k]==rt){turn(rt,k^1);turn(rt,k);}else{turn(x,k);turn(rt,k);}}}if(ancestry==0)root=rt;
}
inline int newnode(char c){int rt;if(point.empty())rt=++size;else{rt=point.front();point.pop();}a[rt].son[0]=a[rt].son[1]=0;a[rt].v=c;a[rt].s=1;return rt;
}
int buildtree(int l,int r){if(l>r)return 0;int mid=l+r>>1,lson=0,rson=0;lson=buildtree(l,mid-1);int rt=newnode(val[mid]);rson=buildtree(mid+1,r);a[rt].son[0]=lson;a[rt].son[1]=rson;if(lson)a[lson].f=rt;if(rson)a[rson].f=rt;pushup(rt);return rt;
}
int kth(int rt,int k){if(a[rt].s<k)return 0;while(1){int y=a[rt].son[0];if(k>a[y].s+1){k-=a[y].s+1;rt=a[rt].son[1];}else if(k<=a[y].s)rt=y;else return rt;}
}
inline void insert(int rt,int k){int front=kth(rt,mouse+1),next=kth(rt,mouse+2),q=buildtree(1,k);splay(front,0);splay(next,front);a[next].son[0]=q;a[q].f=next;pushup(next);pushup(front);
}
void delete_tree(int rt){if(!rt)return;point.push(rt);if(a[rt].son[0])delete_tree(a[rt].son[0]);if(a[rt].son[1])delete_tree(a[rt].son[1]);clean(rt);
}
inline void remove(int rt,int k){int front=kth(rt,mouse+1),next=kth(rt,mouse+k+2),q;splay(front,0);splay(next,front);q=a[next].son[0];delete_tree(q);a[next].son[0]=0;pushup(next);pushup(front);
}
void print(int rt){if(!rt)return;if(a[rt].son[0])print(a[rt].son[0]);if(a[rt].v!=0)printf("%c",a[rt].v);if(a[rt].son[1])print(a[rt].son[1]);
}
inline void get(int rt,int k){int front=kth(rt,mouse+1),next=kth(rt,mouse+k+2),q;splay(front,0);splay(next,front);q=a[next].son[0];print(q);printf("\n");
}
void work(){int x,y,k,t=read();char ch[10];while(t--){scanf("%s",ch);switch(ch[0]){case 'M':mouse=read();break;case 'I':{k=read();for(int j=1;j<=k;j++){char c=getchar();while(c=='\n'||c=='\r')c=getchar();val[j]=c;}insert(root,k);break;}case 'D':{k=read();remove(root,k);break;}case 'G':{k=read();get(root,k);break;}case 'P':mouse--;break;case 'N':mouse++;break;}}
}
void init(){val[1]=val[2]=0;root=buildtree(1,2);
}
int main(){init();work();return 0;
}
转载于:https://www.cnblogs.com/Yangrui-Blog/p/9074513.html
BZOJ1507 [NOI2003]Editor相关推荐
- 【bzoj1507】[NOI2003]Editor
第二次写rope了 rope大法好!!! 1 #include<algorithm> 2 #include<iostream> 3 #include<ext/rope&g ...
- BZOJ ac100题存档
不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...
- bzoj 乱刷计划 50/50
前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...
- BZOJ-1507 文本编辑器(Editor)
一道极其相似的题...http://hi.baidu.com/8361101/item/5b149103cbf4007cbee97e5f 就多了个区间查找,少了个翻转... 少了翻转的话貌似可以不用S ...
- [NOI2003] 文本编辑器
洛谷题目链接:[NOI2003]文本编辑器 题目描述 很久很久以前, DOS3.xDOS3.xDOS3.x 的程序员们开始对 EDLINEDLINEDLIN 感到厌倦.于是,人们开始纷纷改用自己写的文 ...
- editor修改样式 vue_vue+element-ui项目搭建实战
1.使用vue ui创建vue工程 利用vue-cli提供的图形化工具快速搭建vue工程: 命令行运行:vue ui 工程结构说明 build:项目构建webpack(打包器)相关代码 config: ...
- html+txt+编辑器,txtPro Text Editor
txtPro Text Editor是一款文本编辑器,也是一款多语言代码编辑器.html编辑器.多样化的编辑器,你可以选择需要的代码效果,选择你喜欢的字体编辑.txtPro还附带了键盘快捷方式,并正确 ...
- html自动补全pspad,免费代码编辑器 PSPad Editor 5.0.4.541 中文多语免费版
What's new in PSPad 5.0.4 Build 541 December 31, 2020 Autocomplete doesn't complete numbers in autom ...
- Delphi Code Editor 之 编辑器选项
可从Code Editor的右键菜单中选择"Properties"菜单项来查看编辑器选项.也可以从主菜单[Tools | Editor Options-]打开编辑器选项对话框.如下 ...
最新文章
- 如何在Eclipse中使用tomcat9 运行servlet开发简单的动态网页?
- MYSQL: DML/DDL/DCL
- jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】
- Error:(1, 1) java: 非法字符: ‘\ufeff’
- 无刷新二级联动菜单的Request问题
- Spring Boot的SpringApplication类详解
- 杜甫的《望岳》在哪里作的?山脚下还是山头上?
- 2021-08-13servlet 原理及注意事项
- cad2022新功能介绍(autocad2022简体中文版)
- 有了这三个网站,你再也不用去找其它工具网站了
- 语音识别提取视频文案
- HTML学生个人网站作业设计——HTML+CSS+JavaScript优分期大学生分期购物商城(7页)
- 如何用C语言开发图形化游戏
- 实验报告微型计算机拆卸顺序表,顺序表的操作实验报告馒头制作.doc
- 【论文翻译】ADVIO: An Authentic Dataset for Visual-Inertial Odometry
- background and notification of local
- java s c r ipt_Java Scr ipt高级应用与实践_前端开发教程_源雷技术空间
- 阿里云网站备案期间对网站访问会有什么影响吗?
- unity ulua基础(ulua介绍,lua与C#互相调用)
- 武汉大学计算机学院附近租房,陌生男女合租房引发的趣事