HihoCoder1337 动态第k大(treap)
描述
小Ho:小Hi,之前你不是讲过Splay和Treap么,那么还有没有更简单的平衡树呢?
小Hi:但是Splay和Treap不是已经很简单了么?
小Ho:是这样没错啦,但是Splay和Treap和原来的二叉搜索树相比都有很大的改动,我有点记不住。
小Hi:这样啊,那我不妨再给你讲解一个新的平衡树算法好了。和二叉搜索树相比,它只需要修改insert函数,就可以做到高度的平衡。
小Ho:好,我就喜欢这样的!
输入
第1行:1个正整数n,表示操作数量,10≤n≤100,000
第2..n+1行:每行1个字母c和1个整数k:
若c为'I',表示插入一个数字k到树中,-1,000,000,000≤k≤1,000,000,000
若c为'Q',表示询问树中第k小数字,保证1≤k≤树的节点数量
输出
若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解
样例输入
5
I 3
I 2
Q 1
I 5
Q 2
样例输出
2
3
先结合Treap和这两天写的结构体试一试。
其中
1,rotate函数没差。
2,update在儿子有变化后都要更新。
3,insert有‘&’符号,不需要特殊处理root=0的情况
4,查询kth时注意边界即可推进。
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
const int maxn=;
struct treapdata
{
int ch[],size,cnt,val,rnd;
treapdata(){
ch[]=ch[]=;
size=cnt=val=rnd=;
}
};
struct Treap
{
int root,cnt;
Treap()
{
root=cnt=;
}
treapdata S[maxn];
void update(int now)
{
S[now].size=S[now].cnt+S[S[now].ch[]].size+S[S[now].ch[]].size;
}
void rotate(int &x,int t)
{
int y=S[x].ch[t];
S[x].ch[t]=S[y].ch[-t];
S[y].ch[-t]=x;
update(x);
update(y);
x=y;//!莫忘
}
void insert(int &x,int k)
{
if(x){
if(S[x].val==k) S[x].cnt++;
else{
int t=S[x].val<k;
insert(S[x].ch[t],k);
if(S[S[x].ch[t]].rnd<S[x].rnd) rotate(x,t);
}
}
else{
x=++cnt;
S[x].val=k;
S[x].cnt=;
S[x].rnd=rand();
S[x].ch[]=S[x].ch[]=;
}
update(x);
}
int querykth(int now,int k)//第k小
{
if(k<=S[S[now].ch[]].size) return querykth(S[now].ch[],k);
k=k-S[S[now].ch[]].size-S[now].cnt;
if(k<=) return S[now].val;
return querykth(S[now].ch[],k);
}
};
Treap Tp;
int main()
{
int k,n;
char opt[];
scanf("%d",&n);
while(n--){
scanf("%s",opt);
scanf("%d",&k);
if(opt[]=='I') Tp.insert(Tp.root,k);
else printf("%d\n",Tp.querykth(Tp.root,k));
}
return ;
}
HihoCoder1337 动态第k大(treap)的更多相关文章
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- zoj2112 主席树动态第k大 (主席树&&树状数组)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- zoj 2112 Dynamic Rankings(主席树&动态第k大)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- POJ1442-查询第K大-Treap模板题
模板题,以后要学splay,大概看一下treap就好了. #include <cstdio> #include <algorithm> #include <cstring ...
- ZOJ 2112 Dynamic Rankings (动态第 K 大)(树状数组套主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- [bzoj1901]动态区间k大
定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1) ...
- Dynamic Rankings(动态第k大+树套树)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题目: 思路: 树套树板子题. 代码实现如下: #inclu ...
- zoj2112 主席树动态第k大 ( 参考资料链接)
参考链接: http://blog.csdn.net/acm_cxlove/article/details/8565309 http://www.cnblogs.com/Rlemon/archive/ ...
随机推荐
- 04 Spring框架 依赖注入(一)
整理了一下之前学习spring框架时候的一点笔记.如有错误欢迎指正,不喜勿喷. 上一节我们讲了几个bean的一些属性,用来限制我们实例创建过后的状态. 但是细心的我们会发现其实上面demo创建的实例并 ...
- SourceTree的基本使用---基本介绍/本地开发
转载自https://www.cnblogs.com/tian-xie/p/6264104.html 1. SourceTree是什么 拥有可视化界面的项目版本控制软件,适用于git项目管理 wind ...
- Funq之Lambda表达式入门
今天接受了一个Tranning关于.net3.5 framework中的new feature. 其中最不明白的还是Lambda表达式.回来后又仔细的思考了一番,总算有点体会在这里写一下.既然是入门, ...
- C++中引用编译过的C代码为什么要用“extern c”
函数经过编译系统的翻译成汇编,函数名对应着汇编标号. 因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main 但是C++中函数名与得到的汇编代号 ...
- win7 重启dns
安装xshell.百度一搜就下载了. 修改hosts,hosts路径 C:\Windows\System32\drivers\etc\hosts 写法和linux一样. 重启dns命令 ipconfi ...
- OpenSSL for Android
http://blog.csdn.net/xiongmc/article/details/25736041 OpenSSL1)开源项目Guardian Project试图让Android手机也拥有类似 ...
- 常用模块-----configparser & subprocess
configparser 模块 功能:操作模块类的文件,configparser类型文件的操作类似于字典,大多数用法和字典相同. 新建文件: import configparser cfg=confi ...
- java配置好jdk-bash: /usr/bin/java: No such file or directory
在 Linux 系统中安装 JDK 环境,配置好环境变量后,输入 java.javac 或者 java -version 等时,都提示如下错误: -bash: /usr/local/java/bin/ ...
- Objective-C与Swift的混合编程
Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objecti ...
- ubuntu+vm+ftp
为了将windows下的文件传到linux中去,使用FZ来做服务器,在linux中进入ftp状态获取. 1.下载FileZilla服务器,在windows下安装就行了(试过汉化插件,用了就报错,所以还 ...