poj1442——Black Box

本文介绍了一种使用最大堆和最小堆动态维护数据的方法,以解决一系列查询中寻找第i小元素的问题。通过手动维护堆而非直接使用STL,提高了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目很难理解:向一个容器中不断的添加n个数,然后有一系列查询,每次查询第i小的数并进行输出.

刚开始就一个最小堆,果断超时了。

后来,搜了报告,原来,是用最大与最小堆之间动态维护。保证前i小个数一定留在max堆里。

话说,stl是好东西,代码简洁。但比手动的慢。优缺点同样明显。

http://archive.cnblogs.com/a/1900652/-------->手动维护堆!

#include<iostream> #include<cstdio> #include<queue> using namespace std; #define maxn 30003 int A[maxn],u[maxn]; priority_queue<int ,vector<int >,greater<int >>minheap; priority_queue<int ,vector<int >,less<int >>maxheap; int main() { int i,j; int m,n,flag; cin>>m>>n; for(i=1;i<=m;i++) scanf("%d",&A[i]); for(i=1;i<=n;i++) scanf("%d",&u[i]); j=1;u[0]=0;int k; for(i=1;i<=n;i++) { while(j<=u[i]) { maxheap.push (A[j]); j++; } for(k=u[i]-u[i-1];k>0;k--) { minheap.push (maxheap.top ()); maxheap.pop (); } printf("%d\n",minheap.top ()); maxheap.push (minheap.top ()); minheap.pop (); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值