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 }