Luogu1801_黑匣子_KEY
借这道题练一下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的更多相关文章
- 黑匣子_KEY
黑匣子 (box.pas/c/cpp) [ 问题描述] 某研究小组成员想发明一个黑匣子( 当然不是飞机上那个), 而是一个具有特殊功能的箱子. 这个箱子具有两个功能: 1. 存放一些正整数 x: 2. ...
- 塔吊力矩限制器,塔吊黑匣子,塔吊电脑,tower crane
塔机力矩限制器,tower crane 适用于各种类型的固定臂塔机和可变臂塔机 塔机力矩限制器是塔式起重机机械的安全保护装置,本产品采用32位高性能微处理器为硬件平台,软件算法采用国内最先进的三滑轮取 ...
- 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”
来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...
- P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- 【洛谷P1801】黑匣子
黑匣子 题目链接 看到题解中“维护两个堆”,突然想到了这道题的解法 维护两个堆:大根堆h1, 小根堆h2 大根堆里的是最小的i个值,小根堆里是剩下的值 每Add一个值时 插入到小根堆中, 再比较小根堆 ...
- 洛谷 - P1801 - 黑匣子 - 对顶堆
这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
随机推荐
- JvisualVM的使用【转载】
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
- 查看SQL运行时间
set @d=now(); select * from table; select timestampdiff(second,@d,now());
- psql: FATAL: role “postgres” does not exist
I'm a postgres novice. I installed the postgres.app for mac. I was playing around with the psql comm ...
- angularJs的指令系统和双向数据绑定
一.langularJs的指令系统 <!DOCTYPE HTML> <html ng-app><!--这种以ng开头的就是指令系统,初始化的一个指令,不仅可以加在html ...
- 深入理解 iOS Rendering Process
本文将从 OpenGL 的角度结合 Apple 官方给出的部分资料,介绍 iOS Rendering Process 的概念及其整个底层渲染管道的各个流程. 相信在理解了 iOS Rendering ...
- 异步模式:Callbacks, Promises & Async/Await
[译]异步JavaScript的演变史:从回调到Promises再到Async/Await https://www.i-programmer.info/programming/theory/8864- ...
- office2013密钥
GYWDG-NMV9P-746HR-Y2VQW-YPXKK6HDB9-BNRGY-J3F83-CF43C-D67TXG9N3P-GRJK6-VM63J-F9M27-KHGXKX2YWD-NWJ42-3 ...
- Kali-linux Arpspoof工具
Arpspoof是一个非常好的ARP欺骗的源代码程序.它的运行不会影响整个网络的通信,该工具通过替换传输中的数据从而达到对目标的欺骗.本节将介绍Arpspoof工具的 使用. 9.8.1 URL流量操 ...
- math.random用法
Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and ret ...
- 日期字符串解析--SimpleDateFormat严格限制日期转换setLenient(false)
输入“33/12/2011”,用SimpleDateFormat parse()方法,转化为Date(2012,01,02).这样处理相当“33/12/2011”是正常输入,如果需要"33/ ...