UVA12538 - Version Controlled IDE

https://uva.onlinejudge.org/index.php

  可持久化fhp-treap。像线段树的可持久化一样自上至下,每次新建log(n)个节点即可。

#include<bits/stdc++.h>
const int maxn=50015,maxlen=115;
using namespace std;
int n,cnt;
struct Ttreap{
    int tot,ver;
    static const int maxnode=10000015;
    struct Tnode{
        Tnode *c[2];
        int key,siz;char ch;
        void update(){siz=c[0]->siz+c[1]->siz+1;}
    }T[maxnode],*null,*root[maxn];
    int seed(){return 1ll*rand()*rand()%19990211;}
    void clear(){
        tot=ver=0;null=T;
        null->c[0]=null->c[1]=null;null->siz=0;
        for (int i=0;i<=n;++i) root[i]=null;
    }
    Tnode *newnode(Tnode *x){
        if (x==null) return null;
        Tnode *cur=T+(++tot);
        *cur=*x;return cur;
    }
    Tnode *newnode(char ch){
        Tnode *cur=T+(++tot);
        cur->c[0]=cur->c[1]=null;
        cur->ch=ch;cur->siz=1;cur->key=seed();
        return cur;
    }
    Tnode *merge(Tnode *x,Tnode *y){
        Tnode *t;
        if (x==null) return newnode(y);
        if (y==null) return newnode(x);
        if (x->key<y->key){t=newnode(x);t->c[1]=merge(x->c[1],y);}
        else{t=newnode(y);t->c[0]=merge(x,y->c[0]);}
        t->update();return t;
    }
    void split(Tnode *x,Tnode *&a,Tnode *&b,int rank){
        if (!rank){a=null;b=newnode(x);}
        else if (x->siz<=rank){a=newnode(x);b=null;}
        else if (rank<=x->c[0]->siz){b=newnode(x);split(x->c[0],a,b->c[0],rank);b->update();}
        else{a=newnode(x);split(x->c[1],a->c[1],b,rank-x->c[0]->siz-1);a->update();}
    }
    Tnode *build(char s[]){
        static Tnode *stk[maxlen];int top=0;
        for (int i=1;s[i];++i){
            Tnode *cur=newnode(s[i]),*last=null;
            while (top&&cur->key<stk[top]->key){stk[top]->update();last=stk[top--];}
            cur->c[0]=last;cur->update();
            if (top){stk[top]->c[1]=cur;stk[top]->update();}
            stk[++top]=cur;
        }
        while (top) stk[top--]->update();
        return stk[1];
    }
    void insert(int pos,char s[]){
        Tnode *a,*b;
        root[++ver]=build(s);
        split(root[ver-1],a,b,pos);
        root[ver]=merge(a,root[ver]);
        root[ver]=merge(root[ver],b);
    }
    void remove(int pos,int l){
        ++ver;
        Tnode *a,*b,*c,*d;
        split(root[ver-1],a,b,pos-1);split(b,c,d,l);
        root[ver]=merge(a,d);
    }
    void print(Tnode *x){
        if (x->c[0]!=null) print(x->c[0]);
        putchar(x->ch);cnt+=(x->ch==‘c‘);
        if (x->c[1]!=null) print(x->c[1]);
    }
    void query(int v,int pos,int l){
        Tnode *a,*b,*c,*d;
        split(root[v],a,b,pos-1);
        split(b,c,d,l);print(c);putchar(‘\n‘);
    }
}treap;
void insert(){
    int p;char q[maxlen];
    scanf("%d%s",&p,q+1);
    q[strlen(q+1)+1]=0;
    p-=cnt;treap.insert(p,q);
}
void remove(){
    int p,c;scanf("%d%d",&p,&c);
    p-=cnt;c-=cnt;treap.remove(p,c);
}
void query(){
    int v,p,c;scanf("%d%d%d",&v,&p,&c);
    v-=cnt;p-=cnt;c-=cnt;treap.query(v,p,c);
}
int main(){
    srand((unsigned)time(NULL));
    scanf("%d",&n);treap.clear();
    for (int t,i=1;i<=n;++i){
        scanf("%d",&t);
        switch (t){
            case 1:insert();break;
            case 2:remove();break;
            case 3:query();break;
        }
    }
    return 0;
}

my code

时间: 2024-10-06 00:43:46

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_problem&problem=4156 题目拷贝难度大我就不复制了. 题目大意:维护一个字符串,要求支持插入.删除操作,还有输出第 i 次操作后的某个子串.强制在线. 思路1:使用可持久化treap可破,详细可见CLJ的<可持久化数据结构的研究>. 思路2:rope大法好,详见:http

Git详细教程

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异. Git基础 若是理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 下面就从它的基本思想和工作原理讲起: 直接记录快照,而非差异比较 Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异.这类系统 (CVS,Subversion,Perforce,Bazaar 等等)每次记录

利用Spring Roo搭建spring/springMVC/jpa(hibernate)

之前看spring实战的时候,书中提到spring roo工具,一直没有来得及尝试. 这次十一,我和女友一致认为前两天人太挤出去是受罪,于是就窝在了家里,就有了点时间来研究一下技术. 好了,言归正传 ,我比较懒,所以一直在寻找最简单的办法去完成一些事情. 对于框架集成也是如此 ,已经尝试过各种方法了,就是为了寻找更简单,实用. 本次是利用Spring Roo进行搭建,认为是目前最简单的了,并且Roo的配置几乎都是最佳实践. -------------------------------PART1

4月26日

XML3DRepo: A REST API for Version Controlled 3D Assets on the Web Xml3drepo是xml3d和3drepo的新的融合.Xml3d是html的开源扩展,支持webgl浏览器环境中的交互3d图像:3d repo是3d资源的版本控制框架.Xml3drepo就是服务器端两种技术的结合.首先阐述了系统的大体框架,给出了一个简单有效的API定义,能容纳众包3d模型.然后描述了不同的web 3d编码策略,评估了其中几个在API应用下的素的和

Android studio Gradle 构建

软件需求: 安装gradle 下载gradle压缩包,解压到本地. 设置环境变量,新建系统变量,GRADLE_HOME:E:\installspace\gradle-1.11 path中增加;%GRADLE_HOME%\bin 测试是否成功,命令:gradle -v 安装Android studio(如果用Android studio) 下载:http://developer.android.com/sdk/installing/studio.html,运行安装即可 创建项目 File-New

Backup your Android without root or custom recovery

ecently discovered a neat new way to back up apps on my Android without having to use Titanium Backup, having to unlock bootloader or root the device to take a NANDroid snapshot. The icing on the cake - I can do it from command line! Warning: this me

【转】 svn 错误 以及 中文翻译

直接Ctrl+F 搜索你要找的错 # # Simplified Chinese translation for subversion package # This file is distributed under the same license as the subversion package. # # Update to new pot: # msgmerge --update zh_CN.po subversion.pot # # Check translation: # msgfmt

android ButterKnife 解决重复findViewById

简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtitle; TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_ac

[java,maven] 使用 maven 来搭建简单的 netty 开发环境

大致过程是: 首先, 使用 mvn 命令在指定路径下面创建一套简单的  java 文件包. 然后, 使用 JIdea 导入 maven 项目的方式将创建好的文件包加载到 IDE 环境中.‘ 接下来, 在 IDE 环境中修改 pom.xml 文件,在关联标签下面,根据不同需要来,写入 netty 最新版本的值. 随后在 .java 文件中通过调用 import 语句来检测 netty 的系列函数包是否被成功加载到当前项目的开发环境中. 具体过程描述如下 : 1. 首先确保系统中已经正确的安装好 m