【洛谷】【堆】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要处理一串命令. 命令只有两种: ...
随机推荐
- Emgucv(二)Emgucv和Aforge录制视频
一.Emgucv录制视频 Emgucv中的Capture类可以完成视频文件的读取,利用EmguCV播放视频的原理是:将视频看作图片,用capture获取抓取通道,通过不断的调用{frame = cap ...
- 【代码笔记】iOS-左右可滑动的选择条
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- 【代码笔记】iOS-自动成表格的效果
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import "LabelOnBackImag ...
- pom.xml配置文件内容记录
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- How to work with the snap environment
How to work with the snap environment SummaryThe snap environment manages snap agents and snap toler ...
- Spring Boot—03REST请求
package com.smartmap.sample.ch1.controller.rest; import java.util.List; import org.apache.commons.lo ...
- 使用Keras进行多GPU训练 multi_gpu_model
使用Keras训练具有多个GPU的深度神经网络(照片来源:Nor-Tech.com). 摘要 在今天的博客文章中,我们学习了如何使用多个GPU来训练基于Keras的深度神经网络. 使用多个GPU使我们 ...
- C++箱子排序
箱子排序 实现 把每个箱子用一个链表实现.在进行节点分配之前,每个箱子都是空的. 基本思想 1.从与排序链表的头部开始,逐个删除节点,并把它放到合适的箱子链表的头部 2.收集并连接每个箱子中的节点,产 ...
- insufficient privileges for 'SYS' when 'shutdown immediate'
SQL> select * from v$version; BANNER------------------------------------------------------------- ...
- ES6-Generator
Generator 关键词:状态机,遍历器,同步方式写异步方法 基本概念 形式上,Generator函数是一个普通函数,但是有两个特征. function关键字与函数名之间有一个星号. 二是,函数体内 ...