luogu P1801 【黑匣子_NOI导刊2010提高(06)】
这里提供一个简单实现新思路:
.
约定:
- 以下n指代的数的数量,不是题目所指的n
- 以下m指代询问的数量,不是题目所指的m
(不好意思,这是本人习惯)
分块+堆
堆一次只能输出堆顶的一个元素,如果我要找第k小的元素, 理论上复杂度是 O(k*n),这样肯定会TLE
那么我们能不能,把这些数排序后分成几段连续的数在几个堆里,没次查找先去找在哪个堆,再去找在堆里的排名
这样做的话,就可以跳过一些数了
那分成几段才比较优?
分少了,堆里查找就会慢
分多了,找堆就会慢
如果你学过分块的话,你就可以反应过来了,分成根号n段理论上是最好的,因为平摊了两个步骤的复杂度
查找的时候通过 O(sqrt n)来找到在哪个堆,再用 O(sqrt n log n)在堆里来找到它的具体数值*
插入值与查找类似,先找到所处的堆,再加入到堆
还有细节问题,请看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define int long long
using namespace std;
const int N=3e5+10,M=N;
int A[N],B[N],belong[N];
priority_queue<int>q[M];
int m,n;
inline void add(int x){
int op=lower_bound(B+1,B+1+m,x)-B;
int blo=belong[op];
q[blo].push(-x);
}
int size,all;
inline int ask(int x){
int op;
for(int i=0;i<=m;i++){
if(x>q[i].size())
x-=q[i].size();
else{
op=i;
break;
}
}
vector<int>p;
int ans=0;
while(q[op].size()){
int u=-q[op].top();q[op].pop();
//弹出
p.push_back(u);
x--;
if(x==0){
ans=u;
break;
}
}
for(int i=0;i<p.size();i++)
q[op].push(-p[i]);//把弹出的数再放回去
return ans;
}
signed main(){
cin>>m>>n;
size=pow(m,1.0/3.0);
all=ceil((double)m/size);
for(int j=1;j<=all;j++)
for(int i=(j-1)*size+1;i<=j*size;i++)
belong[i]=j;
//初始化块
for(int i=1;i<=m;i++){
scanf("%lld",&A[i]);
B[i]=A[i];
}
sort(B+1,B+1+m);
//排序方便判断排名,选择堆
int num=1;
for(int i=1,x;i<=n;i++){
scanf("%lld",&x);
for(int j=num;j<=x;j++)add(A[j]);
num=x+1;
printf("%lld\n",ask(i));
}
}
luogu P1801 【黑匣子_NOI导刊2010提高(06)】的更多相关文章
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- 【luogu P1801 黑匣子_NOI导刊2010提高(06)】 题解
题目链接:https://www.luogu.org/problemnew/show/P1801 替罪羊树吼啊! #include <cstdio> #include <cstrin ...
- 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.这个 ...
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...
- [洛谷P1801]黑匣子_NOI导刊2010提高(06)
题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解
昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...
- 题解 P1801 【黑匣子_NOI导刊2010提高(06)】
蒟蒻来发题解了.我仔细看了一下其他题解,各位巨佬用了堆,红黑树,splay,treap之类的强大算法,表示蒟蒻的我只会口胡这些算法,所以我决定用一种极其易理解的算法————fhq treap,作为tr ...
随机推荐
- Redis 的底层数据结构(压缩列表)
上一篇我们介绍了 redis 中的整数集合这种数据结构的实现,也谈到了,引入这种数据结构的一个很大的原因就是,在某些仅有少量整数元素的集合场景,通过整数集合既可以达到字典的效率,也能使用远少于字典的内 ...
- 详解Kafka Producer
上一篇文章我们主要介绍了什么是 Kafka,Kafka 的基本概念是什么,Kafka 单机和集群版的搭建,以及对基本的配置文件进行了大致的介绍,还对 Kafka 的几个主要角色进行了描述,我们知道,不 ...
- JAVA 调用HTTP接口POST或GET实现方式
HTTP是一个客户端和服务器端请求和应答的标准(TCP),客户端是终端用户,服务器端是网站.通过使用Web浏览器.网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请 ...
- Linux服务器更改Apache2默认页面
方式一 获取root权限 su root //或者 sudo -i 进入 /var/www目录下 cd /var/www 创建目录 mkdir -m 777 myhtml // myhtml为自己创建 ...
- 《计算机网络 自顶向下方法》 第3章 运输层 Part1
由于个人精力和智商有限,又喜欢想太多.钻牛角尖,导致学习系统性知识很痛苦,尝试改变学习方式,慢慢摸索 现在看到 rdt2.0,又有点看不下去 现在的想法: 要有个目标,且有截止时间(作业模式.考试模式 ...
- 点击a标签的时候出现虚影
在a标签中添加 outline:none;就可以去除了
- windows7设置定时任务运行ThinkPHP框架程序
1. 设置Windows的任务计划 可以参考win7计划任务的设置方法 2. 新建Windows执行文件bat 新建cron.bat文件,内容如下: D: cd \wamp\www\tp32 D:\w ...
- git Lab ssh方式拉取代码失败
gitLab在linux上已经安装好了, 在配置项目的时候报如下异常 使用http方式没问题, 但是用ssh方式设置repository URL 提示资源库不存在. returned status c ...
- mysql中 drop、truncate和delete的区别
mysql中drop.truncate和delete的区别 (1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作. TRUNC ...
- SqlServer2005 查询 第八讲 order by
今天我们来说模糊查询 模糊查询 -- --模糊查询[主要用在搜索中]格式:select 字段的集合 from 表名 where 某个字段名 like 匹配条件 --注意:匹配条件通常含有通配符,通配符 ...