洛谷 P1801 黑匣子_NOI导刊2010提高(06)

题目描述

BlackBox是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black Box要处理一串命令。

命令只有两种:

ADD(x):x元素放进BlackBox;

GET:i1,然后输出Blackhox中第i小的数。

记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。例如:

我们来演示一下一个有11个命令的命令串。(如下图所示)

现在要求找出对于给定的命令串的最好的处理方法。ADDGET命令分别最多200000个。现在用两个整数数组来表示命令串:

1.A(1)A(2)…A(M):一串将要被放进Black Box的元素。每个数都是绝对值不超过2000000000的整数,M$200000。例如上面的例子就是A=(31,一428-10002)

2.u(1)u(2)…u(N):表示第u(j)个元素被放进了Black Box里后就出现一个GET命令。例如上面的例子中u=(l266)。输入数据不用判错。

输入输出格式

输入格式:

第一行,两个整数,MN

第二行,M个整数,表示A(l)

……A(M)

第三行,N个整数,表示u(l)

…u(N)

输出格式:

输出BlackBox根据命令串所得出的输出串,一个数字一行。

输入输出样例

输入样例#1 复制

7 4
3 1 -4 2 8 -1000 2
1 2 6 6

输出样例#1 复制

3
3
1
2

说明

对于30%的数据,M≤10000;

对于50%的数据,M≤100000

对于100%的数据,M≤200000

算法分析

填数过程中找第s小的数,如果一遍遍查找肯定会超时,运用单纯堆和优先队列,出队入队也很耗时,所以我们可以用两个堆,大根堆和小根堆,但如何实现在填入i个数时找第s小的数呢,我们可以在先往大根堆里填数,如果超过s,那就把它放进小根堆,这样就能保证大根堆里的数目个数为s-1且为前s-1小的数且从大到小,即一个大根堆维护第1——s-1小的数,一个小根堆维护s——N小的数

代码实现

 

#include<bits/stdc++.h>
using namespace std;
#define N 200001
int a[N],b[N];

priority_queue<int,vector<int>,greater<int> >small;
priority_queue<int>big;
int main()
{
int n,m;
cin>>n>>m;
int i,j;


for(i=1;i<=n;i++)
    cin>>a[i];
for(i=1;i<=m;i++)
    cin>>b[i];
    int s=0;//记录输出第几小的数
    j=1;

  for(i=1;i<=n;i++)
  {
      big.push(a[i]);
      if(big.size()>s)//保证big中的数不超过s
      {
          small.push(big.top());
                      //保证big维护第1——s-1小的数
          big.pop();   
      }

      while(i==b[j])//while保证可以有重复
      {
          s++;     //变化要寻找的数
          cout<<small.top()<<endl;
          big.push(small.top());
          small.pop();
           j++;
      }
  }

return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值