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 }

 

posted @ 2013-01-23 15:16  _雨  阅读(153)  评论(0编辑  收藏  举报