UVA12538 Version Controlled IDE
题意翻译
维护一种数据结构,资磁三种操作。
1.在p位置插入一个字符串s
2.从p位置开始删除长度为c的字符串
3.输出第v个历史版本中从p位置开始的长度为c的字符串
1≤n≤50000,所有字符串总长度小于等于106,输出字符串总长度小于等于20000
强制在线,每次输入中的数字都要减去你的所有输出中字母c的个数
Translated by @litble
题目描述
输入输出格式
输入格式:
输出格式:
输入输出样例
- 6
- 1 0 abcdefgh
- 2 4 3
- 3 1 2 5
- 3 3 3 4
- 1 4 xy
- 3 5 4 6
- bcdef
- bcg
- bxyc
Solution:
本题可持久化平衡树裸题,画风和神犇CLJ的可持久化数据结构研究中的最后一题超级编辑器,貌似没啥区别。
我们用可持久化平衡树维护字符串的中序遍历,对于各操作:
1、在上一版本的某一位置加入一段字符串:对加入的字符串中序遍历建树(因为treap的随机值原因,树根不一定是$\frac{1+n}{2}$,这里我骚操作每个节点的键值都加上父亲的键值以保证树的形态),然后将原版本的树以插入位置split,再二次merge。
2、删除上一版本的某一位置开始的一段长度的字符串:先split出这段区间,然后merge左右子树。
3、输出某一版本的某一位置开始的一段长度的字符串:先split出这段区间,然后中序遍历这段区间。
注意本题强制在线需要统计输出的字符$c$的个数。
代码:
- /*Code by 520 -- 9.27*/
- #include<bits/stdc++.h>
- #define il inline
- #define ll long long
- #define RE register
- #define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
- #define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
- using namespace std;
- const int N=;
- int n,cnt,now,tc,root[];
- struct node{
- int ls,rs,date,siz,rnd;
- }t[N];
- char s[];
- int newnode(int v){
- ++cnt;
- t[cnt].date=v,t[cnt].siz=,t[cnt].rnd=rand()%;
- return cnt;
- }
- il void up(int rt){t[rt].siz=t[t[rt].ls].siz+t[t[rt].rs].siz+;}
- int merge(int x,int y){
- if(!x||!y) return x+y;
- if(t[x].rnd<t[y].rnd){
- int p=++cnt;t[p]=t[x];
- t[p].rs=merge(t[p].rs,y);
- up(p);
- return p;
- }
- else {
- int p=++cnt;t[p]=t[y];
- t[p].ls=merge(x,t[p].ls);
- up(p);
- return p;
- }
- }
- void split(int rt,int k,int &x,int &y){
- if(!rt) {x=,y=;return;}
- if(t[t[rt].ls].siz<k) {
- x=++cnt;t[x]=t[rt];
- split(t[x].rs,k-t[t[rt].ls].siz-,t[x].rs,y);
- up(x);
- }
- else {
- y=++cnt;t[y]=t[rt];
- split(t[y].ls,k,x,t[y].ls);
- up(y);
- }
- }
- int build(int l,int r,int lst) {
- if(l>r) return ;
- int m=l+r>>,rt=newnode(s[m]);
- t[rt].rnd+=lst;
- t[rt].ls=build(l,m-,t[rt].rnd),t[rt].rs=build(m+,r,t[rt].rnd);
- up(rt);
- return rt;
- }
- void print(int rt){
- if(!rt) return;
- print(t[rt].ls);
- putchar(t[rt].date);
- if(t[rt].date=='c') tc++;
- print(t[rt].rs);
- }
- int main(){
- int opt,p,q,v,x,y,z,rt;
- while(scanf("%d",&n)!=EOF){
- while(n--){
- scanf("%d",&opt);
- if(opt==){
- scanf("%d%s",&p,s+);
- rt=build(,strlen(s+),);
- p-=tc,++now;
- if(!p) root[now]=merge(rt,root[now-]);
- else if(p==t[root[now-]].siz) root[now]=merge(root[now-],rt);
- else {
- x=y=; split(root[now-],p,x,y);
- root[now]=merge(x,rt),root[now]=merge(root[now],y);
- }
- }
- else if(opt==){
- ++now;
- scanf("%d%d",&p,&q),p-=tc,q-=tc;
- x=y=z=;
- split(root[now-],p-,x,y),split(y,q,y,z);
- root[now]=merge(x,z);
- }
- else {
- scanf("%d%d%d",&v,&p,&q),v-=tc,p-=tc,q-=tc;
- x=y=z=;
- split(root[v],p-,x,y),split(y,q,y,z);
- print(y),putchar('\n');
- }
- }
- tc=cnt=now=;memset(root,,sizeof(root));
- }
- return ;
- }
UVA12538 Version Controlled IDE的更多相关文章
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- UVA 12538 Version Controlled IDE 解题报告
题意:给三种操作 1.在p位置插入一个字符串. 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 解法:可以用平衡树做,但是不会.后来又听说可一用一个叫ro ...
- UVA - 12538 Version Controlled IDE (可持久化treap)
紫薯例题 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],ch[ ...
- uva12538
12538 Version Controlled IDEProgrammers use version control systems to manage files in their project ...
- IDE spec for registry settings
IDE spec for registry settings Advanced customization of Visual Assist is possible with registry set ...
- How to stop pycharm show files in project in red color?
You can change the file color to whatever you want. File > Settings > Editor > Colors&F ...
- TFS - 使用微软测试管理器实现跨团队项目的测试用例管理
在团队项目之间实现测试用例和测试计划的共享,是很多客户关注的问题.尤其在开发产品+服务的团队中,对测试用例的共享要求比较高.下面就如何在Team Foundation Server中如何实现团队项目之 ...
- 【转】 svn 错误 以及 中文翻译
直接Ctrl+F 搜索你要找的错 # # Simplified Chinese translation for subversion package # This file is distribute ...
- android ButterKnife 解决重复findViewById
简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtit ...
随机推荐
- Python学习过程笔记整理(一)
编码方式 -Utf8编码方式:# -*- coding: utf-8 -*- 注释 -行注释 # -块注释 '''...'''或"""...""&qu ...
- Datawhale MySQL 训练营 Task5
数据导入导出 导入table http://www.runoob.com/mysql/mysql-database-import.html 导出table http://www.runoob.com/ ...
- uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法
如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...
- php学习--变量和数据类型
PHP变量 变量 程序执行期间,可以变化的量即为变量. 声明变量 以美元$ 符号声明 注意:(PHP严格区分大小写) 变量名称以 字母.或下划线开始,后面跟上数字/字母/下划线,不能包含特殊字符 ...
- Django数据库 相关之select_related/prefetch_related
- 性能相关 user_list = models.UserInfo.objects.all() for row in user_list: # 只去取当前表数据 select_related,主动连 ...
- aircrack-ng无线破解实验
查看无线网卡 airmon-ng 开启网卡监听模式 airmon-ng start wlan0 扫描附近的wifi airodump-ng wlan0mon 停止扫描: ctrl c 使用airodu ...
- 华策光通信: LED可见光通信室内定位项目获最具投资价值奖
3月21日上午,一场持续3个多小时的O2O领域的创业DemoShow在深圳科兴科学园会议中心激烈上演.来自华策光通信的基于LED可见光通信室内精准定位项目作为LED与室内定位领域的跨界融合项目经过精彩 ...
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 2
今日完成任务 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需给出对应的调研总结博客链接:如果完成的任务为学习技术任务,需 ...
- Sprint10
进展:设置事件提醒部分已经完成,接下来是实现完成后在添加主界面显示已添加的事件及时间,并可设置可用与不可用.
- GridView的控件说明[字典]-----方便查询
GridView 控件以表格的形式显示数据,并提供对数据进行排序,选择,编辑,删除等功能. GridView能够完成的功能具体可以总结如下: 1,通过数据源控件将数据绑定到GridView控件 2,对 ...