题目传送门

借这道题练一下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. chrome浏览器Network面板请求Timing分析

    Timing显示资源在整个请求生命周期过程中各部分话费的时间. Queueing 排队的时间花费.可能由于该请求被渲染引擎认为是优先级比较低的资源(图片).服务器不可用.超过浏览器并发请求的最大连接数 ...

  2. js的鼠标事件整理-------Day47

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/marSmile_tbo/article/details/34202437 今天回来的有些晚了,实在是 ...

  3. 高性能 Socket 组件 HP-Socket v3.2.1-RC3 公布

    HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包括服务端组件.client组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统.提供 C/C+ ...

  4. 通过css使文字有渐变的效果

    <style> .color{ background-image: -webkit-gradient(linear, left center, right center, from(rgb ...

  5. 3、RabbitMQ-work queues 工作队列

    work queues 工作队列 1.模型图: 为什么会出现 work queues? 前提:使用 simple 队列的时候 我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的( ...

  6. random模块 参生随机数

    记得要import random模块 随机整数: >>> import random >>> random.randint(0,99) 21 随机选取0到100间的 ...

  7. Microsoft visual c++ 14.0 is required问题

    错误信息: error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Too ...

  8. Eclipse常用快捷键(持续更新)

    编辑相关快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1.[Ctrl+O] 显示类中方法和属性的大纲, ...

  9. Linux中使用iptables开放特定端口

    禁止其他主机对该特定主机进行访问和远程连接控制,所以只开放特定端口 只控制INPUT链就可达到控制其他主机对该主机的访问. 1.首先关闭INPUT链 iptables -P INPUT DROP 使用 ...

  10. Loadrunner之HTTP接口测试

    Loadrunner之HTTP接口测试 接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程. ...