poj 1442 名次树
这回要求的是第k小的元素,
参考了ljl大神的模板,orz
- //insert 插入
- //remove 删除
- //_find 查找
- //kth 返回root为根的树中第k小的元素
- //treap插入、删除、查询时间复杂度均为O(logn)
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <ctime>
- #include <cstdio>
- using namespace std;
- int a[],n,m;
- struct Node
- {
- Node *ch[];
- int r,v,s;
- Node(int v):v(v)
- {s=;ch[]=ch[]=NULL;r=rand();}
- int cmp(int x) const{
- if(x==v)return(-);
- return (x<v)?():();
- }
- void maintain(){
- s=;
- if(ch[]!=NULL)s+=ch[]->s;
- if(ch[]!=NULL)s+=ch[]->s;
- }
- };
- void rotate(Node* &o,int d)
- {
- Node* k=o->ch[d^];
- o->ch[d^]=k->ch[d];
- k->ch[d]=o;
- o->maintain();
- k->maintain();
- o=k;
- }
- void insert(Node* &o,int x)
- {
- if(o==NULL) o=new Node(x);
- else {
- int d=(x<o->v)?:;
- insert(o->ch[d],x);
- if((o->r)<(o->ch[d]->r))
- rotate(o,d^);
- }
- o->maintain();
- }
- void remove(Node* &o,int x)
- {
- int d=o->cmp(x);
- if(d==-){
- Node* u=o;
- if(o->ch[]==NULL){o=o->ch[];delete u;}else
- if(o->ch[]==NULL){o=o->ch[];delete u;}else {
- int c=(o->ch[])>(o->ch[])?():();
- rotate(o,c);
- remove(o->ch[c],x);
- }
- }
- else remove(o->ch[d],x);
- if(o!=NULL) o->maintain();
- }
- int find(Node* &o,int x)
- {
- while(o!=NULL){
- int d=o->cmp(x);
- if(d==-)
- return ;
- else
- o=o->ch[d];
- }
- return ;
- }
- int kth(Node* o,int k)
- {
- while(o!=NULL){
- int lchsize=(o->ch[]!=NULL)?
- (o->ch[]->s):;
- if(lchsize+==k)
- return o->v;
- else {
- int d=(lchsize<k);
- o=o->ch[d];
- k-=d*(lchsize+);
- }
- }
- return ;
- }
- int main()
- {
- Node* root=NULL;
- int u,ans,p=;
- srand(time());
- cin>>m>>n;
- for(int i=;i<m;i++)
- cin>>a[i];
- for(int i=;i<=n;i++)
- {
- cin>>u;
- while(p<u)
- insert(root,a[p++]);
- ans=kth(root,i);
- cout<<ans<<endl;
- }
- return ;
- }
poj 1442 名次树的更多相关文章
- POJ 2985 名次树
题意:1~n个猫,有合并操作,有询问操作,合并两只猫所在的集合,询问第K大的集合. 分析:合并操作用并查集,用size维护,询问操作用Treap.注意优化,不能刚开始就把所有size = 1放到名次树 ...
- poj 1442 Black Box(优先队列&Treap)
题目链接:http://poj.org/problem?id=1442 思路分析: <1>维护一个最小堆与最大堆,最大堆中存储最小的K个数,其余存储在最小堆中; <2>使用Tr ...
- Treap和名次树
Treap名字的来源:Tree+Heap,正如名字一样,就是一颗简单的BST,一坨堆的合体.BST的不平衡的根本原因在于基于左<=根<=右的模式吃单调序列时候会无脑成长链,而Treap则添 ...
- UVa 1479 (Treap 名次树) Graph and Queries
这题写起来真累.. 名次树就是多了一个附加信息记录以该节点为根的树的总结点的个数,由于BST的性质再根据这个附加信息,我们可以很容易找到这棵树中第k大的值是多少. 所以在这道题中用一棵名次树来维护一个 ...
- uvalive 5031 Graph and Queries 名次树+Treap
题意:给你个点m条边的无向图,每个节点都有一个整数权值.你的任务是执行一系列操作.操作分为3种... 思路:本题一点要逆向来做,正向每次如果删边,复杂度太高.逆向到一定顺序的时候添加一条边更容易.详见 ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- UVaLive5031 Graph and Queries(时光倒流+名次树)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20332 [思路] 时光倒流+名次树(rank tree). 所谓“ ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
随机推荐
- 从Maya中导入LightMap到unity中
导入步骤 1.在Maya中为每一个模型烘焙好帖图(tif格式),会发现烘焙好的图和UV是一一对应的 2.把模型和烘焙帖图导入到Unity中 3.选中材质,修改Shader为 Legacy Shader ...
- java11-6 String类的其它功能
String类的其他功能: 替换功能: String replace(char old,char new) String replace(String old,String new) 去除字符串两空格 ...
- Android Studio系列教程六--Gradle多渠道打包
Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...
- Android studio disign 问题
有些低配置的电脑使用android studio 写xml的时候,disign会一直处于rendering,有可能是xml使用的图片过大导致渲染不出来
- nginx安装pcre
一.有的服务器上没有安装pcre那么安装nginx的时候会报错 所以在安装之前我们可以: yum install pcre-devel 如果很不巧,服务器也没有配yum,也不能连互联网.那么我们只能自 ...
- 收集的User-Agent
headers = [ {"User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; A ...
- pandas groupby
pandas.DataFrame.groupby DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, gr ...
- ThinkPHP项目CMS内容管理系统开发视频教程【20课】(3.02GB)
ThinkPHP背景介绍: ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业级应用开发而诞生的. ...
- Android 获取手机Mac地址,手机名称
/** * 获取手机mac地址<br/> * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取 ...
- Matlab的title如何实现换行显示?
怎么才能在'B Range'前面开始换行呢? title(['abc','L Range:',num2str(a),'(nm)','~~',num2str(b),'(cm)','B Range:',n ...