题目传送门

借这道题练一下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. Debian 静态网络配置

    allow-hotplug enp6s0 iface enp6s0 inet static address gateway 192.168.2.1 # dns-* options are implem ...

  2. Linux文件系统知识记录——ext2描述

    最近完成了一个编程作业,大致功能是给定一个文件名,给出该文件所在目录和其本身所占用的簇号等信息.笔者选用了Linux的ext系列文件系统作为实验对象,通过实验对ext2文件系统的存储和索引有了一个较为 ...

  3. BZOJ 1013 球形空间产生器sphere 高斯消元

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1013 题目大意: 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困 ...

  4. mysql优化---笔记

    ​一.优化方法:(加粗部分为比较重要的) 1.数据表设计合理:2.索引优化:3.SQL语句优化,定位慢查询explain ;4.分表技术.分区技术:5.读写分离(配置):6.创建适当的存储过程.函数. ...

  5. BZOJ1861:[ZJOI2006]书架(Splay)

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  6. js 日历插件开发

    1.HTML完整代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  7. 码农视角 - Angular 框架起步

    开发环境 1.npm 安装最新的Nodejs,便包含此工具.类似Nuget一样的东西,不过与Nuget不同的是,这玩意完全是命令行的.然后用npm来安装开发环境,也就是下边的angular cli. ...

  8. SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成增删改查逻辑

    习惯使用jpa操作对象的方式,现在用mybatis有点不习惯. 其实是懒得写SQL,增删改查那么简单的事情你帮我做了呗,mybatis:NO. 没办法,自己搞喽! 这里主要是实现了通过代码自动生成my ...

  9. Linux系统的环境变量$PATH

    $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 修改$PATH的方法有很多,比如: export PA ...

  10. Redmine使用学习

    注:陈刚在公司架设了 Redmine xx公司产品档案管理系统,并且与tortoisegit集成了在一起:真心不错!比如git:192.168.10.46,而redmine:192.168.10.46 ...