[BZOJ1507] [NOI2003] Editor (splay)
Description

Input
Output
输出文件editor.out的每行依次对应输入文件中每条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
HINT
Source
Solution
splay的区间操作。
#include <bits/stdc++.h>
using namespace std;
struct spaly
{
char key;
int siz, fa, c[];
}a[];
char inss[];
int ptot; void push_up(int k)
{
a[k].siz = a[a[k].c[]].siz + a[a[k].c[]].siz + ;
} void rotate(int &k, int x)
{
int y = a[x].fa, z = a[y].fa;
int dy = a[y].c[] == x, dz = a[z].c[] == y;
if(k == y) k = x, a[x].fa = z;
else a[z].c[dz] = x, a[x].fa = z;
a[y].c[dy] = a[x].c[!dy], a[a[x].c[!dy]].fa = y;
a[x].c[!dy] = y, a[y].fa = x;
push_up(y);
} void splay(int &k, int x)
{
while(k != x)
{
int y = a[x].fa, z = a[y].fa;
if(k != y)
if(a[y].c[] == x ^ a[z].c[] == y) rotate(k, x);
else rotate(k, y);
rotate(k, x);
}
push_up(x);
} int find(int k, int x)
{
if(!k || x == a[a[k].c[]].siz + ) return k;
if(x <= a[a[k].c[]].siz) return find(a[k].c[], x);
return find(a[k].c[], x - a[a[k].c[]].siz - );
} void build(int &k, int fa, int i, int m)
{
if(i == m) return;
k = ++ptot, a[k].fa = fa, a[k].key = inss[i];
build(a[k].c[], k, i + , m);
push_up(k);
} void printf(int k)
{
if(!k) return;
printf(a[k].c[]), printf("%c", a[k].key), printf(a[k].c[]);
} int main()
{
int n, m, root = , pos = , ctot = ;
char op[];
scanf("%d", &n), ptot = ;
a[].c[] = , a[].siz = , a[].siz = , a[].fa = ;
while(n--)
{
scanf("%s", op);
if(op[] == 'M') scanf("%d", &pos);
if(op[] == 'I')
{
scanf("%d", &m), ctot += m;
for(int i = ; i < m; i++)
{
inss[i] = getchar();
if(inss[i] < || inss[i] > ) i--;
}
splay(root, find(root, pos + ));
splay(a[root].c[], find(root, pos + ));
build(a[a[root].c[]].c[], a[root].c[], , m);
push_up(a[root].c[]), push_up(root);
}
if(op[] == 'D')
{
scanf("%d", &m), m = min(m, ctot - pos);
splay(root, find(root, pos + ));
splay(a[root].c[], find(root, pos + m + ));
a[a[root].c[]].c[] = , ctot -= m;
push_up(a[root].c[]), push_up(root);
}
if(op[] == 'G')
{
scanf("%d", &m), m = min(m, ctot - pos);
splay(root, find(root, pos + ));
splay(a[root].c[], find(root, pos + m + ));
printf(a[a[root].c[]].c[]), puts("");
}
if(op[] == 'P') pos--;
if(op[] == 'N') pos++;
}
return ;
}
[BZOJ1507] [NOI2003] Editor (splay)的更多相关文章
- BZOJ1507 [NOI2003]Editor 【splay】
1507: [NOI2003]Editor Time Limit: 5 Sec Memory Limit: 162 MB Submit: 4129 Solved: 1660 [Submit][St ...
- BZOJ1507 [NOI2003]Editor
是一道裸的Splay(反正我不会Splay,快嘲笑我!) 只需要维护在数列上加点删点操作即可,不会写Splay的渣渣只好Orz iwtwiioi大神一下了.(后来发现程序直接抄来了...) 就当我的第 ...
- BZOJ 1507 NOI2003 Editor Splay
题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...
- 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay
[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...
- BZOJ_1507_Editor_[NOI2003]_(Splay)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1507 简单区间操作的模板题 1507: [NOI2003]Editor Time Limit: ...
- BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...
- 【BZOJ-1507】Editor 块状链表
1507: [NOI2003]Editor Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 3397 Solved: 1360[Submit][Stat ...
- 1507: [NOI2003]Editor(块状链表)
1507: [NOI2003]Editor Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4157 Solved: 1677[Submit][Stat ...
随机推荐
- Python自动化测试、性能测试成长路线图
Python自动化测试成长路线图 性能测试成长路线图
- 自动化测试工具selenium的使用
1.自动化测试的前提
- Javascript获取数组中最大和最小值
取出数组中最大值或最小值是开发中常见的需求,今天继续讲解如何获取javascript数组中最大和最小值. 1.排序法 首先我们给数组进行排序,可以按照从小到大的顺序来排,排序之后的数组中第一个和最后一 ...
- JSTL的相关使用
index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- 让网站通过Https访问
Prerequisites Before you begin, you should have some configuration already taken care of. We will be ...
- 剑指offer第六天
29.最小的K个数 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 解法一: Partition思想 允许改变原始数组的情况, ...
- 《android开发进阶从小工到专家》读书笔记--网络框架的设计与实现
第一步: 第一层:Request--请求类型,JSON,字符串,文件 第二层:消息队列--维护了提交给网络框架的请求列表,并且根据响应的规则进行排序.默认情况下按照优先级和进入队列的顺序来执行,该队列 ...
- HDU - 2614 dfs
思路:记录当前用的最大时间即刚解决的问题花费的时间,下一个应该做的题的时间必须大于等于刚才的. AC代码 #include <cstdio> #include <cmath> ...
- uva 1151最小生成树
先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...
- SIFT解析(一)建立高斯金字塔
SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)在目标识别.图像配准领域具有广泛的应用,下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简 ...