写平衡树修锅快修到死系列
我太蠢了
其实是平衡树裸体裸题
插入,删除,交换前驱或后继,查询rank和kth
维护一个pos数组,表示第i个书的编号
然后注意许许多多的细节,没了

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct Node{int lson,rson,ran,val,w,sz;
}Treap[80000<<2];
int pos[80100],Lx,Rx,Nodecnt,n,m,root;
void pushup(int o){Treap[o].sz=Treap[Treap[o].lson].sz+Treap[Treap[o].rson].sz+1;
}
void rotateR(int &o){int k=Treap[o].lson;Treap[o].lson=Treap[k].rson;Treap[k].rson=o;Treap[k].sz=Treap[o].sz;pushup(o);o=k;
}
void rotateL(int &o){int k=Treap[o].rson;Treap[o].rson=Treap[k].lson;Treap[k].lson=o;Treap[k].sz=Treap[o].sz;pushup(o);o=k;
}
int NewNode(int cx,int wl){++Nodecnt;Treap[Nodecnt].sz=1;Treap[Nodecnt].lson=Treap[Nodecnt].rson=0;Treap[Nodecnt].ran=rand();Treap[Nodecnt].val=wl;Treap[Nodecnt].w=cx;return Nodecnt;
}
void insert(int &o,int cx,int wl){if(!o){o=NewNode(cx,wl);return;}Treap[o].sz++;if(wl<=Treap[o].val){insert(Treap[o].lson,cx,wl);if(Treap[Treap[o].lson].ran<Treap[o].ran)rotateR(o);// pushup(o);}else{insert(Treap[o].rson,cx,wl);if(Treap[Treap[o].rson].ran<Treap[o].ran)rotateL(o);// pushup(o);}
}
void erase(int &o,int wl){if(!o)return;if(Treap[o].val==wl){if(Treap[o].lson==0||Treap[o].rson==0){o=Treap[o].lson+Treap[o].rson;return;}if(Treap[Treap[o].lson].ran<Treap[Treap[o].rson].ran){rotateR(o);erase(o,wl);}else{rotateL(o);erase(o,wl);}pushup(o);return;}Treap[o].sz--;if(wl<=Treap[o].val){erase(Treap[o].lson,wl);pushup(o);}else{erase(Treap[o].rson,wl);pushup(o);}
}
int ranks(int o,int wl){if(!o)return 0;if(wl==Treap[o].val){return Treap[Treap[o].lson].sz+1;}if(wl<=Treap[o].val){return ranks(Treap[o].lson,wl);}   else{return ranks(Treap[o].rson,wl)+Treap[Treap[o].lson].sz+1;}
}
int kth(int k,int o){if(k==0)return 0;if(k==Treap[Treap[o].lson].sz+1)return Treap[o].w;if(k<=Treap[Treap[o].lson].sz)return kth(k,Treap[o].lson);elsereturn kth(k-Treap[Treap[o].lson].sz-1,Treap[o].rson);
}
int pre(int wl){return kth(ranks(root,wl)-1,root);
}
int back(int wl){return kth(ranks(root,wl)+1,root);
}
int main(){Lx=1;// freopen("7.in","r",stdin);// freopen("test.out","w",stdout);srand(19260817);scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);++Rx;pos[x]=Rx;insert(root,x,Rx);}char opt[20];int sx,tx;for(int i=1;i<=m;i++){scanf("%s",opt);if(opt[0]=='T'){scanf("%d",&sx);erase(root,pos[sx]);Lx--;pos[sx]=Lx;insert(root,sx,Lx);}else if(opt[0]=='B'){scanf("%d",&sx);erase(root,pos[sx]);Rx++;pos[sx]=Rx;insert(root,sx,Rx);}else if(opt[0]=='I'){scanf("%d %d",&sx,&tx);if(tx==0)continue;if(tx==1){int need=back(pos[sx]);erase(root,pos[sx]);erase(root,pos[need]);swap(pos[sx],pos[need]);insert(root,sx,pos[sx]);insert(root,need,pos[need]);   }if(tx==-1){int need=pre(pos[sx]);erase(root,pos[sx]);erase(root,pos[need]);swap(pos[sx],pos[need]);insert(root,sx,pos[sx]);insert(root,need,pos[need]);}}else if(opt[0]=='A'){scanf("%d",&sx);printf("%d\n",ranks(root,pos[sx])-1);}else if(opt[0]=='Q'){scanf("%d",&sx);printf("%d\n",kth(sx,root));}}return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10029180.html

p2596 书架(Treap)相关推荐

  1. ZJOI2006书架Treap做法

    作为一个刚学Treap只会打板子的菜鸡,这个做法还参悟题解了一节课才参悟出来的,感觉这个方法很巧妙 变量解释 A[i]表示编号为i的书的优先级,优先级第k小就是从上向下数第k本书 树的节点Node.v ...

  2. JAVA查询数据库并显示jsp_java servlet数据库查询并将数据显示到jsp页面

    需要的jar包:mysql-connector-java.jar build path只是个jar包的引用,部署的时候想不丢包最好还是手动拷贝到对应项目的lib文件下. 在try{}中定义的变量为局部 ...

  3. 句子嵌入_带句子转换器库的句子嵌入

    句子嵌入 数据科学,机器学习(Data Science, Machine Learning) I came across this simple to use sentence-transformer ...

  4. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

  5. P2596 [ZJOI2006]书架(fhq treap)

    P2596 [ZJOI2006]书架 我们用fhq treap来完成这一题 对于一个新插入的节点我们取权值为其索引值,其所记录的valuevaluevalue是其当前索引所在位置. 操作一:把索引为v ...

  6. P2596 [ZJOI2006]书架 无旋treap 按照排名分裂

    传送门 文章目录 题意: 思路: 题意: 实现如下操作: 思路: fhq-treap板子辣,不要被他的编号误导了,我们还是需要按照排名来分裂,从上到下标号1−n1-n1−n即可,注意在按照排名分裂的时 ...

  7. 【FHQ treap】维护书架(金牌导航 无旋式treap-1)

    维护书架 金牌导航 无旋式treap-1 题目大意 给出一个序列a,编号为1~n,让你做若干操作,操作有五种: 1.把第x个数放在最前面 2.把第x个数放在最后面 3.把第x个数和第x±1x\pm 1 ...

  8. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  9. luogu P3850 [TJOI2007]书架(平衡树、无旋treap(按排名分裂))

    luogu P3850 [TJOI2007]书架 这里要的是字符串,所以我们最好用一个map映射一下,不要在结构体中用string代替val. fhq-treap中所有的排名实际上都指的是前面有多少个 ...

最新文章

  1. crontab 备份mysql数据库_crontab定时备份mySQL数据库
  2. 【官网搭建】在网站首页底部添加备案号链接至工信部首页及版权所有。
  3. python office自动化_Python office automation:文档,python,自动化,办公,文件,篇,整理,一键,完成...
  4. 每个软件开发人员都应该知道的5种设计模式
  5. 【Spark-core学习之六】 Spark资源调度和任务调度
  6. 箱线图怎么判断异常值_箱线图(Box-plot)中,异常值很多说明什么?
  7. excel财务案例建模_Pro Excel财务建模:技术创业公司的构建模型
  8. 基于原语的千兆以太网RGMII接口设计
  9. 树莓派安装中文输入法
  10. IME Starters Try-outs 2018 F - First Day + G - Greatest IME
  11. 为什么我不给孩子看国产动漫?看看这5部法国动漫,你就知道了!【转】
  12. 10年攒一百万回老家一个月6千利息,现实么
  13. 快速将非Word中的不可编辑的公式转换为Word文档中公式编辑器里可编辑的公式的办法
  14. 基于主从博弈的智能小区电动汽车充电管理及代理商定价策略
  15. 连日来卖报纸嘅一d感想,
  16. minikube addons enable ingress 启动错误
  17. contentprovider与resolver使用
  18. tf.constant(常量)
  19. Vuex是干什么的?以及核心概念
  20. 世界上最难的视觉图_【若寒专栏】被喻为世界上最难的联赛——2019赛季日本J2联赛球队总结(7 完结)...

热门文章

  1. mysql5.0修改字符集,查看mysql字符集及修改表结构
  2. Java基础:正则表达式
  3. Photoshop CS6软件安装教程
  4. rancher k8s docker 关系_通过rancher部署k8s过程实战分享
  5. Hadoop详解(七):YARYN完全分布式环境搭建
  6. 计算机网络:第一章 概述
  7. mats显卡测试软件的使用教程,MATS使用说明
  8. mllib java怎么调用_如何准备mllib中的训练数据
  9. 泛珠三角计算机作品大赛2018,2018年泛珠三角大学生计算机作品赛广西赛区选拔赛圆满结束...
  10. 洛谷P1939 【模板】矩阵加速(数列)