【洛谷】【堆】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要处理一串命令. 命令只有两种: ...
随机推荐
- Winform 常用的方法
一,Winform 如何内嵌窗体 1,判断窗体中是否以还有内嵌窗体 private void ClosePreForm() { foreach (Control item in this.spCont ...
- Android sdk manager 下载速度慢的问题
不多说了,直接附上方法: 首先打开Ecplise 中Android sdk manager,打开后, 在此窗口的上方打开偏好设置选项,然后在里面设置HTTP Proxy server和HTTP Pro ...
- 关于在web端运行项目,eclipse报PermGen space错误
之前在网上也查到过许多解决的方法,但可能因为本人脸黑........也修改过eclipse文件目录中的相关配置文件,并没有得到相应的帮助,因此把自己的改正方法分享下: window-->pref ...
- nylg 开方数
开方数 时间限制:500 ms | 内存限制:65535 KB 难度:3 描述 现在给你两个数 n 和 p ,让你求出 p 的开 n 次方. 输入 每组数据包含两个数n和p.当n和p都为0 ...
- Java的工厂模式(三)
除了一般的工厂模式之外,还有抽象工厂模式,抽象工厂模式更强调产品族的概念,一个具体工厂生产出来的系列商品都是一个产品族的. 假设我们有两个具体工厂,分别是袋装水果工厂和罐装水果工厂,它们都能生产苹果和 ...
- 前端AMD、CMD和commonJs-前端知识
前端AMD和CMD是在模块化的基础上产生并且得到大幅度的引用的. AMD 即Asynchronous Module Definition(点击链接可以查看AMD面试题),中文名是异步模块定义的意思.它 ...
- gotop(返回顶部)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Android自定义Button按钮显示样式
关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法. 首先android的selector是在 ...
- linux yum list、search、-y、install、update、remove、grouplist、groupinstall、groupremove
redhat使用yum需要付费yum安装的也是rpm包 centos的网络yum源默认已经配置好了,连接的是centos官方yum源,在国外,网速慢 yum源配置在/etc/yum.repos.d下 ...
- c# 设计模式 之:策略模式
算法与对象的耦合: 对象可能经常需要使用多种不同的算法,但是如果变化频繁,会将类型变得脆弱... 动机: 在软件构建过程中,某些对象使用的算法可能多种多样,经常 ...