【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
【题目描述:】
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)的更多相关文章
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- 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.这个 ...
- 洛谷——P1795 无穷的序列_NOI导刊2010提高(05)
P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)
P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...
- 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)
P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解
昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...
- [洛谷P1801]黑匣子_NOI导刊2010提高(06)
题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...
随机推荐
- 【转】详解spring 每个jar的作用
spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...
- java 二分法
源码 public class Dichotomy { public static void main(String[] args){ int[] array = new int[12]; for(i ...
- 插入sql返回主键id
<insert id="insertSelective" parameterType="com.xxx.model.XDetail" useGenerat ...
- GitHub fork的使用
我的GitHub账号是lanshanxiao,fork的账号是king1ko1king,再此说明! fork的项目是:Class-for-Everyone-Java-Server- 作者源项目地址是: ...
- MQ之如何做到消息幂等 (转 优秀)
一.缘起 MQ消息必达,架构上有两个核心设计点: (1)消息落地 (2)消息超时.重传.确认 再次回顾消息总线核心架构,它由 发送端.服务端.固化存储.接收端 四大部分组成. 为保证消息的可达性,超时 ...
- POJ3126(KB1-F BFS)
Prime Path Description The ministers of the cabinet were quite upset by the message from the Chief ...
- git常用命令和场景
总结: git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase orig ...
- Ubuntu14.04安装Torch7笔记
Ubuntu14.04安装Torch7笔记 利用快捷键Ctrl+Alt+T打开Ubuntu终端 第一步: 获取安装LuauJIT(C语言编写的Lua的解释器)和Torch所必需的依赖包. 代码如下: ...
- Java 中父类怎么调用子类的方法?
父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...
- asp:FileUpload 上次图片
<asp:FileUpload ID="FileUpload附件" runat="server" Width="200px" /> ...