好久没刷题了,脑子都锈掉了。这题是用优先队列做的,而且是STL里的。STL里的priority_queue默认是大堆,你可以理解为递减数列。如果要用小堆需要一点参数,我只记得一个简单些的方法:priority_queue<T, vector<T>, greater<T> >,T表示数据类型,这样就是一个小堆了。做这题时我“参考”了别人的代码,不过原版的注释写得很混乱,不知道是不是用来忽悠人的。以下是代码:
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 int A[30010],u[30010]; 5 int main() 6 { 7 int m,n,i,j,t; 8 while(cin>>m>>n) 9 { 10 priority_queue <int, vector<int> > small; 11 priority_queue <int, vector<int>,greater<int> > big; 12 for(i = 0; i < m; i++) 13 cin>>A[i]; 14 for(j = 0; j < n; j++) 15 cin>>u[j]; 16 j = 0; 17 for(i = 0; i < m && j < n; i++) 18 { 19 if(small.empty()) 20 big.push(A[i]); 21 else if(A[i] < small.top()) 22 { 23 t = small.top(); 24 small.pop(); 25 big.push(t); 26 small.push(A[i]); 27 } 28 else big.push(A[i]); 29 while(u[j] == i+1) 30 { 31 j++; 32 t = big.top(); 33 big.pop(); 34 cout<<t<<endl; 35 small.push(t); 36 } 37 } 38 } 39 return 0; 40 }