书架

splay

#include<bits/stdc++.h>
#define N 80005
using namespace std;
char str[20];
int pos[N],size[N],father[N];
int c[N][2],v[N];
int n,m,num,num1,sz,root;
int inline read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
void update(int x){
    size[x]=size[c[x][0]]+size[c[x][1]]+1;
    pos[v[c[x][0]]]=c[x][0];
    pos[v[c[x][1]]]=c[x][1];
}
void rotate(int &root,int x){
    int y=father[x];
    int z=father[y];
    int p,q;
    if (c[y][0]==x)
        p=0;
    else 
        p=1;
    q=p^1;
    if (y==root)
        root=x;
    else {
        if (c[z][0]==y)
            c[z][0]=x;
        else 
            c[z][1]=x;
    }
    father[x]=z;
    father[y]=x;
    father[c[x][q]]=y;
    c[y][p]=c[x][q];
    c[x][q]=y;
    update(y);
    update(x);
}
void splay(int &root,int x){
    int y,z;
    while (x!=root){
        y=father[x];
        z=father[y];
        if (y!=root){
            if ((c[z][0]==y)^(c[y][0]==x))
                rotate(root,x);
            else rotate(root,y);
        }
        rotate(root,x);
    }
    pos[v[x]]=x;
}
void Insert(int x){
    v[++sz]=x;
    size[sz]=1;
    pos[x]=sz;
    c[sz][0]=c[sz][1]=0;
    if (sz>1){
        c[sz-1][1]=sz;
        father[sz]=sz-1;
        splay(root,sz);
    }
}
int find(int x,int k){
    int y=c[x][0];
    if (size[y]+1==k)
        return x;
    else 
        if (size[y]>=k)
            return find(y,k);
    else 
        return find(c[x][1],k-size[y]-1);
}
void top(int x){
    x=pos[x];
    splay(root,x);
    if (!c[x][0])
        return;
    if (!c[x][1]){
        c[x][1]=c[x][0];
        c[x][0]=0;
    }
    else{
        int y=find(root,size[c[x][0]]+2);
        father[c[root][0]]=y;
        c[y][0]=c[root][0];
        c[root][0]=0;
        splay(root,y);
    }
}
void bottom(int x){
    x=pos[x];
    splay(root,x);
    if (!c[x][1])
        return;
    if (!c[x][0]){
        c[x][0]=c[x][1];
        c[x][1]=0;
    }
    else{
        int y=find(root,size[c[x][0]]);
        father[c[root][1]]=y;
        c[y][1]=c[root][1];
        c[root][1]=0;
        splay(root,y);
    }
}
void insert1(int f,int x){
    if (!f)
        return;
    splay(root,pos[x]);
    int y=find(root,f==1?size[c[pos[x]][0]]+2:size[c[ pos[x] ] [0]]);
    int x1=v[y];
    int x2=pos[x];
    swap(pos[x],pos[x1]);
    swap(v[x2],v[y]);
}
void ask1(int x){
    splay(root,x);
    printf("%d\n",size[c[x][0]]);
}
int main(){
    //scanf("%d%d",&n,&m);
    n=read();
    m=read();
    root=1;
    for (int i=1;i<=n;i++){
        //scanf("%d",&num);
        num=read();
        Insert(num);
    }
    for (int i=1;i<=m;i++){
        scanf("%s",str);
        switch(str[0]){
            case 'T':/*scanf("%d\n",&num);top(num);*/top(read());break;
            case 'B':/*scanf("%d\n",&num);bottom(num);*/bottom(read());break;
            case 'I':/*scanf("%d%d\n",&num,&num1);insert1(num,num1);*/insert1(read(),read());break;
            case 'A':/*scanf("%d\n",&num);ask1(pos[num]);*/ask1(pos[read()]);break;
            case 'Q':/*scanf("%d\n",&num);printf("%d\n",v[find(root,num)]);*/printf("%d\n",v[find(root,read())]);break;
        }
    }
}

 

转载于:https://www.cnblogs.com/wjnclln/p/9596122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文档管理精灵-电子书架 功能简介 相信朋友你的各种各样的文档资料也不少吧,面对一大堆的资料,如何去管理它?如何很快地从自己的一大堆资料中找出需要的主题内容?不用愁,有了电子书架,一切的烦恼都会离你而去。言归正传,就让我们来看看她是一个什么样的一个东东吧。 适合对象 电子书架用于文档管理,所以适合于以下人员:网上";;;拾贝者";;;截取保存网上信息、文秘工作者管理重要档案、新闻媒体工作者保存书面信息、能进行计算机操作的学生作笔记、教师备课、各种科技人员撰写保存论文、游戏攻略收集者、炒股人员保存股市信息...等等...以及各种需要进行文档管理的信息工作者;但由于电子书架的特殊功用,所以又适合于以下人员:程序员、网站站长管理制作网页、机密档案管理员。 功能特点 电子书架的功能特点是:快速的资料截取、迅捷的资料查找、清晰的资料管理、丰富的格式转换、方便的电子书制作、安全的资料保存、多用户支持、Delphi及VB代码文本格式化等等,具体功能特点如下: 资料即取即存 电子书架为您收集资料预备了一个很实用的功能,就是";;;即取即存";;;,您所要做的仅仅是";;;复制";;;,操作就是这么简单。您只要开启电子书架,点一下菜单[工具]->[监视剪贴板],或者就按F7,好了,你在任何地方复制或剪切的资料都会被电子书架所收集并保存,并智能建立标题,不管你复制的是纯文本、漂亮的RTF格式文本、还是HTML网页,电子书架都为你忠实地保存下来。当然你也可以在这几种格式之间转化切换。你只要看到什么有用就复制一下,电子书架会自动为你保存,不用麻烦您高贵的手再去粘贴,避免了Windows常规操作时又复制又粘贴地频繁在各窗口间切换的烦琐,非常方便于您截取有价值的资料。你如果把电子书架最小化了(可以隐藏于系统栏),那么就更酷了,打个比方,电子书架就象是你办公室里灵巧的小秘,你只要复制你所要的,她就会把你的内容接管过去保存起来。 资料迅速查找 可以查标题、可以查内容;可以精确查找、可以模糊查找;可以逐个查找、可以批量查找;可以在当前目录位置查找、也可以在全库中搜索。与此同时,为了更方便迅速地找到需要的文档,电子书架为你设置了20个书签,使您能在常要查找的目录之间迅速跳转; 资料交流 电子书架内置了Email功能,您可以随时将资料库中的内容E-Mail给您的朋友,也可以带上附件;设有好友通讯录; 网址收藏 无论您在哪里复制一下网址,Collector就会问你要不要保存这个网址,并保存为HTML格式,建立链接。当然,您如果认为这个讨厌,您也可以关闭这个功能(只要不监视就可以了); IE安全恢复 在网上取一些资料时,鉴于有个别网站为了打响自己,私自修改用户Internet Explorer默认页及标题设置,并锁定注册表、禁用默认页修改,开机自动进入其网站。在电子书架中增加了IE安全恢复的功能,如果您的Internet Explorer已经被修改,可以用恢复功能恢复到默认设置(其实是三脚猫功夫,只不过是修改注册表而已); 多格式支持 电子书架支持的TXT、RTF、HTML等多种格式,所以,可以根据个人需要变化多样,非常漂亮。参见:《附录》-《电子书架范本》中的示例效果; 多格式间转换 可以在电子书架支持的TXT、RTF、HTML等格式之间编辑及相互转化,具备批量文件格式转化功能,您可以批量转换磁盘上的文件,可作为HTML自动生成、文本格式转换、小型Internet浏览工具;同时您也可以调用外部的任何一个文本编辑器(如WordPad、Microsoft Word)、网页编辑程序来对文档或者网页进行编辑,调用Microsoft Word方便您插入各种字符和表格(表格插入功能不完善);RTF-HTML转换功能,可以把存在于电子书架中的资料导出为HTML文件,导出后格式不会丢失; 编码转换 支持在BIG5和GB之间、DOS、UNIX之间相互转化,也可作为一个码制转换工具使用; 资料导入 支持鼠标拖放导入操作,您可以把文件或者文件夹拖入到电子书架内,文件或者文件夹的内容就会按照您的设置被导入,导入时智能判断BIG、HTML格式; 资料导出、电子书制作、批量网页制作 您存放在电子书架内的资料可以方便地导出为TXT纯文本文件、RTF多格式文档、HTML网页文件、Windows帮助格式的CHM文件、甚至CHM工程文件组。可以批量导出,导出生成的HTML文件自动建立索引页。这个功能使得电子书架将来有可能成为电子书制作、批量网页制作、批量文件生成的一个好工具; 光碟目录管理 这一个功能实在简陋,没有什么特色。功能是

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值