poj1442Black Box(优先队列)

http://poj.org/problem?id=1442

题意很难懂  题挺巧妙的 建立两个优先队列 一个从小到大 另一个从大到小 随时更新两队中的值 使其为1~i 和 i+1~m

View Code
 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<queue>

 5 using namespace std;

 6 int num[30010],op[30010];

 7 int main()

 8 {

 9     int n,m,i,j,k,g;

10     while(cin>>m>>n)

11     {

12         priority_queue <int> q1;

13         priority_queue<int, vector<int>, greater<int> > q2;

14         for(i = 1; i <= m ; i++)

15            cin>>num[i];

16         for(i = 1; i <= n ; i++)

17             cin>>op[i];

18         op[0] = 0;g=0;

19         for(i = 1; i <= n ; i++)

20         {

21             k = op[i]-op[i-1];

22             for(j = 1; j <= k ; j++)

23             {

24                 g++;

25                 q2.push(num[g]);

26                 if(!q1.empty()&&q1.top()>q2.top())//把第i小的值放入q2中 使其始终为对头元素

27                 {

28                     q1.push(q2.top());

29                     q2.pop();

30                     q2.push(q1.top());

31                     q1.pop();

32                 }

33             }

34             cout<<q2.top()<<endl;

35             q1.push(q2.top());

36             q2.pop();

37         }

38     }

39     return 0;

40 }

 

你可能感兴趣的:(优先队列)