【题目描述:】

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

命令只有两种:

ADD(x):把x元素放进BlackBox;

GET:i加1,然后输出Blackhox中第i小的数。

记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。

现在要求找出对于给定的命令串的最好的处理方法。ADD和GET命令分别最多200000个。现在用两个整数数组来表示命令串:

1.A(1),A(2),…A(M):一串将要被放进Black Box的元素。每个数都是绝对值不超过2000000000的整数,M<=200000。例如上面的例子就是A=(3,1,一4,2,8,-1000,2)。

2.u(1),u(2),…u(N):表示第u(j)个元素被放进了Black Box里后就出现一个GET命令。例如上面的例子中u=(l,2,6,6)。输入数据不用判错。

【输入格式:】

第一行,两个整数,M,N。

第二行,M个整数,表示A(l)…A(M)。

第三行,N个整数,表示u(l)…u(N)。

【输出格式:】

输出Black Box根据命令串所得出的输出串,一个数字一行。

输入样例#: 

  -   - 

输出样例#: 

输入输出样例

【算法分析:】

开两个堆,一个大根堆,一个小根堆,类似于“中位数”那道题

把每一个要求加入Black_Box的元素放入小根堆,然后把堆顶元素弹出后放到大根堆

这时如果小根堆的堆顶比大根堆的堆顶小,就交换两个堆的堆顶元素,

  直到小根堆的堆顶比大根堆的堆顶元素大,或者小根堆已空

这时大根堆的堆顶元素就是第i小的值

【代码:】

 //黑匣子_NOI导刊2010提高
#include<iostream>
#include<cstdio>
using namespace std; const int MAXN = + ; int n, m, a[MAXN], u[MAXN]; int h1_size, h2_size;
int h1[MAXN], h2[MAXN]; void push1(int x) {
h1[++h1_size] = x;
int now = h1_size, next;
while(now > ) {
next = now >> ;
if(h1[now] < h1[next])
swap(h1[now], h1[next]);
else break;
now = next;
}
}
int pop1() {
int ret = h1[];
h1[] = h1[h1_size--];
int now = , next;
while((now << ) <= h1_size) {
next = now << ;
if(next < h1_size && h1[next|] < h1[next]) next |= ;
if(h1[now] > h1[next])
swap(h1[now], h1[next]);
else break;
now = next;
}
return ret;
} void push2(int x) {
h2[++h2_size] = x;
int now = h2_size, next;
while(now > ) {
next = now >> ;
if(h2[now] > h2[next])
swap(h2[now], h2[next]);
else break;
now = next;
}
}
int pop2() {
int ret = h2[];
h2[] = h2[h2_size--];
int now = , next;
while((now << ) <= h2_size) {
next = now << ;
if(next < h2_size && h2[next|] > h2[next]) next |= ;
if(h2[now] < h2[next])
swap(h2[now], h2[next]);
else break;
now = next;
}
return ret;
} int read() {
int x = , f = ;
char ch = getchar();
while(ch < '' || ch > '') {
if(ch == '-') f = -;
ch = getchar();
}
while(ch >= '' && ch <= '') {
x = (x << ) + (x << ) + ch - ;
ch = getchar();
}
return x * f;
}
void write(int x) {
if(x < ) {
putchar('-');
x = -x;
}
if(x > ) write(x / );
putchar(x % + );
} int main() {
n = read(), m = read();
for(int i = ; i <= n; i++) a[i] = read();
for(int i = ; i <= m; i++) u[i] = read();
for(int i = ; i <= m; i++) {
for(int j = u[i - ] + ; j <= u[i]; j++) push1(a[j]);
push2(pop1());
while(h1_size > && h1[] < h2[]) {
int x1 = pop1(), x2 = pop2();
push1(x2), push2(x1);
}
write(h2[]);
putchar('\n');
}
}

【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)的更多相关文章

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

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

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

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

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

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

  4. 洛谷——P1795 无穷的序列_NOI导刊2010提高(05)

    P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...

  5. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)

    P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...

  6. 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

    P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...

  7. 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解

    昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...

  8. [洛谷P1801]黑匣子_NOI导刊2010提高(06)

    题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...

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

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

随机推荐

  1. vue常见知识点整理

    什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...

  2. [HTML5] Canvas绘制简单图片

    获取Image对象,new出来 定义Image对象的src属性,参数:图片路径 定义Image对象的onload方法,调用context对象的drawImage()方法,参数:Image对象,x坐标, ...

  3. Linux 添加定时任务,crontab -e 命令与直接编辑 /etc/crontab 文件

    1. 使用 crontab -e 命令编辑定时任务列表 使用这个命令编辑的定时任务列表是属于用户级别的,初次编辑后在 /var/spool/cron 目录下生成一个与用户名相同的文件,文件内容就是我们 ...

  4. 有序的数据结构中:内存操作红黑树快,磁盘操作b+树快

    红黑树常用于存储内存中的有序数据,增删很快,b+树常用于文件系统和数据库索引,因为b树的子节点大于红黑树,红黑树只能有2个子节点,b树子节点大于2,子节点树多这一特点保证了存储相同大小的数据,树的高度 ...

  5. WCF之maxConnections

    <bindings> <netTcpBinding> <binding name="TcpBinding" closeTimeout="00 ...

  6. wcf远程服务器返回错误404

    最近根据quartz.net 和wcf做资讯内容定时推送,wcf调用的时候出现远程服务器返回错误404,一直找不到原因是什么,客户端和服务器地址和配置都没啥问题,最后发现wcf请求数据,有传输大小限制 ...

  7. jQuery基础(样式篇,DOM对象,选择器,属性样式)

      1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真 ...

  8. mysql 的varchar类型小记

    参考链接:MySQL的varchar长度问题 今天用mysql做一个demo,创建了个表: -- 借款表 CREATE TABLE jk ( id ) NOT NULL auto_increment, ...

  9. .net开发环境搭建

    本地开发环境下载网址:https://msdn.itellyou.cn/,选择个人免费版本 下载工具 下载安装win7系统选择asp.net 和web开发,右侧可选全部选择,大约11GB左右

  10. OTSU算法学习 OTSU公式证明

    OTSU算法学习   OTSU公式证明 1 otsu的公式如下,如果当前阈值为t, w0 前景点所占比例 w1 = 1- w0 背景点所占比例 u0 = 前景灰度均值 u1 = 背景灰度均值 u = ...