【数据结构】黑匣子

前端之家收集整理的这篇文章主要介绍了【数据结构】黑匣子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

命令只有两种:

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

GET:i加1,然后输出BlackBox中第i小的数。

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

例如:

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

序号

操作

i

数据库

输出

1

ADD(3)

0

3

2

GET

1

3

3

3

ADD(1)

1

1,3

4

GET

2

1,3

3

5

ADD(-4)

2

-4,1,3

6

ADD(2)

2

-4,2,3

7

ADD(8)

2

-4,3,8

8

ADD(-1000)

2

-1000,-4,8

9

GET

3

-1000,8

1

10

GET

4

-1000,8

2

11

ADD(2)

4

-1000,8

现在要求找出对于给定的命令串的最好的处理方法。ADD和GET命令分别最多有200000个。

现在用两个整数数组来表示命令串:

1.A(1),A(2),…A(M):一串将要被放进BlackBox的元素。每个数都是绝对值不超过2000000000的整数,M≤200000。例如上面的例子就是A=(3,1,-4,2,8,-1000,2)。

2.u(1),u(2),…u(N):表示第u(j)个元素被放进了BlackBox里后就出现

一个GET命令。例如上面的例子中u=(1,6,6)。输入数据不用判错。

【输入】

第一行,两个整数,M,N。

第二行,M个整数,表示A(1)……A(M)。

第三行,N个整数,表示u(1)……u(N)。

输出

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

【输入样例】

74

31-428-10002

1266

输出样例】

3

3

1

2

数据规模:

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

对于50%的数据,M≤100000;

对于100%的数据,M≤200000。

【分析】

开两个堆,保证要找的元素在堆顶。

代码

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q1;
priority_queue<int,vector<int>,greater<int> >q2;
int aa[200010],a[200010],b[200010],c,m,n;
int main()
{
  freopen("blackBox.in","r",stdin);
  freopen("blackBox.out","w",stdout);
  cin>>m>>n;
  for (int i=1;i<=m;i++)  scanf("%d",&a[i]);
  for (int i=1;i<=n;i++)  scanf("%d",&b[i]);
  int c=1,cc=b[1];
  for (int i=1;i<=m;i++)
   {
   	q2.push(a[i]);
	q1.push(q2.top());
	q2.pop();
   	if (q1.size()>c) 
   	{
   		q2.push(q1.top());
   		q1.pop();
   	}
   	while (i==b[c])
   	{
   		printf("%d\n",q1.top()); 
		c++;
		if (b[c]==b[c-1])
		{
			q1.push(q2.top());
			q2.pop();
	    }
   	}
   }
	return 0;
}
http://cojs.tk/cogs/problem/problem.php?pid=601这里的数据范围较小。 原文链接:https://www.f2er.com/datastructure/383178.html

猜你在找的数据结构相关文章