Black Box

唉,一天几乎就只做了这道题,成就感颇低啊!

题意:有一系列插入查找操作,插入每次在有序数列中插入一个数,保证插入后数列还是有序,初始数列为空,每次查询一个排名为i的数,第i次查询排名为i的数。给你两个数列,第一个是插入数的顺序,第二个是每次查询发生在插入第U(i)个数之后。具体看样例,说实话我也理解了挺久,数列1 2 6 6 表示的是第一次查询是在插入第一个数之后,第二次查询是在插入第二个数之后,第三次第四次查询都是在插入第六个数之后,但第三第四次查询的排名就不同了。

思路:可惜set无法用下标访问啊,所以treap有着set无法比拟的优势。这题除了treap当然也还有其他的方法了。用treap是比较简单了,不涉及删除操作,只有查找插入和旋转三种,唯一不同的就是每个节点加了一个size域用来表示左右子树和本身的节点数之和。这样每次查询排名为k的也就是第k小的数,只需判断节点左子树的节点个数的关系然后选择在左子树还是右子树中查找。

int a[N],b[N];
struct node
{
node *ch[2];
int r,v,s;
node(int vv)
{
r=rand();//优先级
v=vv;//值
ch[0]=ch[1]=NULL;
}
void maintain()
{
s=1;//左右子树的节点数加一(本身一个节点)
if(ch[0]) s+=ch[0]->s;
if(ch[1]) s+=ch[1]->s;
}
};
int find(node *root,int s)//查找排名为s的节点值,即第s小
{
int k=root->ch[0]==NULL?0:root->ch[0]->s;
if(s==k+1) return root->v;
else if(s<=k) return find(root->ch[0],s);
return find(root->ch[1],s-k-1);
}
void rotate(node *&root,int d)//d为0代表左旋
{
node *tmp=root->ch[d^1];
root->ch[d^1]=tmp->ch[d];
tmp->ch[d]=root;
root->maintain();//注意先维护root,再维护tmp,因为之后tmp节点就相当于是root了,最后还是要赋给root的
tmp->maintain();
root=tmp;
}
void insert(node *&root,int v)
{
if(root==NULL) root=new node(v);
else
{
int d=v<root->v?0:1;//左子树都比根节点小,右子树都比根节点大
insert(root->ch[d],v);
if(root->ch[d]->r > root->r) rotate(root,d^1);
}
root->maintain();
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
node *root=NULL;
int j=1;
for(int i=1;i<=n;i++)
{
insert(root,a[i]);
while(j<=m&&b[j]<=i)
{
int v=find(root,j);
printf("%d\n",v);
j++;
}
}
}
return 0;
}

人生第二道treap题,我好菜啊~~

POJ-1442 Black Box,treap名次树!的更多相关文章

  1. POJ 1442 Black Box treap求区间第k大

    题目来源:POJ 1442 Black Box 题意:输入xi 输出前xi个数的第i大的数 思路:试了下自己的treap模版 #include <cstdio> #include < ...

  2. poj 1442 Black Box(优先队列&Treap)

    题目链接:http://poj.org/problem?id=1442 思路分析: <1>维护一个最小堆与最大堆,最大堆中存储最小的K个数,其余存储在最小堆中; <2>使用Tr ...

  3. 「模板」「讲解」Treap名次树

    Treap实现名次树 前言 学平衡树的过程可以说是相当艰难.浏览Blog的过程中看到大量指针版平衡树,不擅长指针操作的我已经接近崩溃.于是,我想着一定要写一篇非指针实现的Treap的Blog. 具体如 ...

  4. UVa 1479 (Treap 名次树) Graph and Queries

    这题写起来真累.. 名次树就是多了一个附加信息记录以该节点为根的树的总结点的个数,由于BST的性质再根据这个附加信息,我们可以很容易找到这棵树中第k大的值是多少. 所以在这道题中用一棵名次树来维护一个 ...

  5. POJ 1442 Black Box(优先队列)

    题目地址:POJ 1442 这题是用了两个优先队列,当中一个是较大优先.还有一个是较小优先. 让较大优先的队列保持k个.每次输出较大优先队列的队头. 每次取出一个数之后,都要先进行推断,假设这个数比較 ...

  6. LA 5031 Graph and Queries —— Treap名次树

    离线做法,逆序执行操作,那么原本的删除边的操作变为加入边的操作,用名次树维护每一个连通分量的名次,加边操作即是连通分量合并操作,每次将结点数小的子树向结点数大的子树合并,那么单次合并复杂度O(n1lo ...

  7. POJ 1442 Black Box

    第k大数维护,我推荐Treap..谁用谁知道....                                                           Black Box Time ...

  8. poj 1442 Black Box(堆 优先队列)

    题目:http://poj.org/problem?id=1442 题意:n,m,分别是a数组,u数组的个数,u[i]w为几,就加到a几,然后输出第i 小的 刚开始用了一个小顶堆,超时,后来看了看别人 ...

  9. POJ 1442 Black Box 堆

    题目: http://poj.org/problem?id=1442 开始用二叉排序树写的,TLE了,改成优先队列,过了.. 两个版本都贴一下吧,赚稿费.. #include <stdio.h& ...

随机推荐

  1. vue2.0:(四)、首页入门,组件拆分1

    为什么需要组件拆分呢?这样才能更符合模块化这样一个理念. 首先是index.html,代码如下: <!DOCTYPE html> <html> <head> < ...

  2. 5、两个栈实现队列------------>剑指offer系列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 栈1: 用于入队列存储 栈2: 出队列时将栈1的数据依次出栈,并入栈到栈2中 栈2出栈即栈1的底部数据 ...

  3. linux各文件夹的作用(转)

    转自:http://www.cnblogs.com/amboyna/archive/2008/02/16/1070474.html linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可 ...

  4. C# 一维数组 二位数组 多维数组

    什么是数组? 数组是一组变量,就是把一些变量串在一起,放在一块. 数组的作用? 假设有一堆变量,每个变量都有一些程序,那么这堆程序放在一起  程序就会混乱,处理起来有些麻烦,那么数组就是把这些变量放在 ...

  5. 树形DP 统计树中长度为K的路径数量——Distance in Tree

    一.问题描述 给出一棵n个节点的树,统计树中长度为k的路径的条数(1<=n<=50000 , 1<=k<=500). 二.解题思路 设d[i][k]表示以i为根节点长度为k的路 ...

  6. 小白安装python软件

    首先下载:anaconda3.x          下载方式:百度搜索 清华镜像anaconda   https://mirrors.tuna.tsinghua.edu.cn/help/anacond ...

  7. javascript单元测试框架mochajs详解(转载)

    章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建议使用箭头函数 钩子函数 钩 ...

  8. spark 省份次数统计实例

    //统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...

  9. linux环境nginx的安装与使用

    因为公司需要需要安装一系列环境,新手上路第一次配的时候什么也不懂在网上找了半天,觉得这篇不错,我在这里顺便记录一下.(原文:https://www.cnblogs.com/wyd168/p/66365 ...

  10. Java截取视频文件缩略图

    /** * 截取视频第0帧的图片 */public static void videoImage(String filePath, String fileName,int widthdist, int ...