题目传送门

借这道题练一下Treap和Splay的板子。

code:

#include <cstdio>
#include <cstdlib>
using namespace std; int read()
{
char c;while(c=getchar(),(c<''||c>'')&&c!='-');
int x=,y=;c=='-'?y=-:x=c-'';
while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x*y;
} int N,M,a[],b[];
int root=,tr[][],v[],f[],rd[];
int cnt=; void rotate(int &x,int o)
{
int k=tr[x][o];
tr[x][o]=tr[k][o^];
tr[k][o^]=x;
f[k]=f[x];
f[x]=f[tr[x][]]+f[tr[x][]]+;
x=k;
} void insert(int &x,int val)
{
if(!x){
x=++cnt;
v[x]=val;
f[x]++;
rd[x]=rand();
return ;
}
f[x]++;
int to=val>v[x];
insert(tr[x][to],val);
if(rd[tr[x][to]]>rd[x])rotate(x,to);
return ;
} int Query(int x,int kth)
{
if(!x)return -;
if(f[tr[x][]]>=kth)return Query(tr[x][],kth);
if(f[tr[x][]]+<kth)return Query(tr[x][],kth-f[tr[x][]]-);
return v[x];
} int main()
{
srand();
N=read(),M=read();
register int i,j;
for(i=;i<=N;i++)a[i]=read();
for(i=;i<=M;i++)b[i]=read();
j=;
for(i=;i<=N;i++){
insert(root,a[i]);
while(i==b[j])
printf("%d\n",Query(root,j)),j++;
}
}

Treap

#include <cstdio>
using namespace std; int root,cnt;
int tr[][],f[],v[],fa[]; int get(int x){return x==tr[fa[x]][];}
void up(int x){f[x]=f[tr[x][]]+f[tr[x][]]+;}
int rotate(int x)
{
int ol=fa[x],olol=fa[ol],to=get(x);
tr[ol][to]=tr[x][to^],fa[tr[x][to^]]=ol;
tr[x][to^]=ol;fa[ol]=x;
fa[x]=olol;
if(olol)
tr[olol][ol==tr[olol][]]=x;
up(ol);up(x);
} void splay(int x)
{
for(int S;S=fa[x];rotate(x))
if(fa[S])
rotate(get(x)==get(S)?S:x);
root=x;
} int dist;
void insert(int &x,int val,int pos)
{
if(!x){
x=++cnt;
v[x]=val;
fa[x]=pos;
f[x]++;
dist=cnt;
return ;
}
int to=val>v[x];
insert(tr[x][to],val,x);
up(x);
return ;
} int Query(int x,int kth)
{
if(!x)return -;
if(f[tr[x][]]>=kth)return Query(tr[x][],kth);
if(f[tr[x][]]+<kth)return Query(tr[x][],kth-f[tr[x][]]-);
return v[x];
} int N,M,a[],b[]; int read()
{
char c;while(c=getchar(),(c<''||c>'')&&c!='-');
int x=,y=;c=='-'?y=-:x=c-'';
while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x*y;
} int main()
{
N=read(),M=read();
register int i,j;
for(i=;i<=N;i++)a[i]=read();
for(i=;i<=M;i++)b[i]=read();
j=;
for(i=;i<=N;i++){
insert(root,a[i],);splay(dist);
while(i==b[j])printf("%d\n",Query(root,j)),j++;
}
return ;
}

Splay

Luogu1801_黑匣子_KEY的更多相关文章

  1. 黑匣子_KEY

    黑匣子 (box.pas/c/cpp) [ 问题描述] 某研究小组成员想发明一个黑匣子( 当然不是飞机上那个), 而是一个具有特殊功能的箱子. 这个箱子具有两个功能: 1. 存放一些正整数 x: 2. ...

  2. 塔吊力矩限制器,塔吊黑匣子,塔吊电脑,tower crane

    塔机力矩限制器,tower crane 适用于各种类型的固定臂塔机和可变臂塔机 塔机力矩限制器是塔式起重机机械的安全保护装置,本产品采用32位高性能微处理器为硬件平台,软件算法采用国内最先进的三滑轮取 ...

  3. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  4. 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)

    [题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...

  5. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  6. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  7. 【洛谷P1801】黑匣子

    黑匣子 题目链接 看到题解中“维护两个堆”,突然想到了这道题的解法 维护两个堆:大根堆h1, 小根堆h2 大根堆里的是最小的i个值,小根堆里是剩下的值 每Add一个值时 插入到小根堆中, 再比较小根堆 ...

  8. 洛谷 - P1801 - 黑匣子 - 对顶堆

    这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...

  9. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

随机推荐

  1. UVA 10288 Coupons---概率 && 分数类模板

    题目链接: https://cn.vjudge.net/problem/UVA-10288 题目大意: 一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最 ...

  2. PHP-----TP框架----命名空间

    TP框架----命名空间 命名空间,起什么作用??? [1]命名空间是一个虚拟的目录,这个文件有可能存在这个电脑里的任何一个地方,但是如果要把这个文件它的命名空间全部写成同一个那么这些文件就相当于在同 ...

  3. Controller如何写的更简化

    Controller层相当于MVC中的C,也是安卓或者前端请求的接口. 首先说Controller为什么需要写的更加简化? 第一.Controller是不能复用的: 第二.即便是将Controller ...

  4. Swift 开发语法

    文/Tuberose(简书作者)原文链接:http://www.jianshu.com/p/5e2d4c34f18e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 简介 Swift 语 ...

  5. HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. Android 4.4系统获取root权限的方法

    1. 准备工作: 准备一台ubuntu机器,将boot.img复制到该机器上,下载必要的工具sudo apt-get install abootimggit clone https://github. ...

  7. C#中HttpWebRequest的用法详解(转载)

    1.HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.2.命名空间:System.Net3.HttpWebRequest对象不是利用new关键字创建 ...

  8. Oracle 11G 隐含参数“_controlfile_autobackup_delay”

    RMAN设置控制文件自动备份,当发生数据库备份时,或建表空间,删除log文件等物理结构发生改变时,oracle会自动备份控制文件. Oracle 10g会立刻备份,Oracle 11g会有几分钟的延迟 ...

  9. Linux -- 目录基本操作(1)

    cd 切换目录 1.切换到指定目录下 #cd 相对/绝对目录 [root@localhost ~]# cd /home/tom/demo [root@localhost demo]# 2.切换到某个用 ...

  10. 实际SQL案例解决方法整理_LEAD函数相关

    表结构及数据如下: 需求: 将记录按照时间顺序排列,每三条记录为一组,若第二条记录与第一条记录相差5分钟,则删除该记录,若第三条与第二条记录相差5分钟,则删除该记录, 第二组同理,遍历全表,按要求删除 ...