N Transaction i Black Box contents after transaction Answer
(elements are arranged by non-descending)
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, 1, 2, 3
7 ADD(8) 2 -4, 1, 2, 3, 8
8 ADD(-1000) 2 -1000, -4, 1, 2, 3, 8
9 GET 3 -1000, -4, 1, 2, 3, 8 1
10 GET 4 -1000, -4, 1, 2, 3, 8 2
11 ADD(2) 4 -1000, -4, 1, 2, 2, 3, 8
7 4 3 1 -4 2 8 -1000 2 1 2 6 6
3 3 1 2
搞两个优先队列, 分别为 最大堆 和 最小堆, 目的是 在 n 个 数里, 获得第几大数。
code:
#include <cstdio> #include <algorithm> #include <queue> #include <vector> using namespace std; void solve( int, int ); int main(void) { //freopen( "d://test.txt", "rw+", stdin ); int n, t; while( scanf( "%d%d", &n, &t ) != EOF ){ solve( n, t ); } return 0; } void solve( int n, int t ) { int *_m = new int [ n+1 ]; int num; priority_queue < int, vector< int >, greater <int> > pri_min; priority_queue < int, vector< int >, less <int> > pri_max; for( int i=0; i < n; ++ i ){ scanf( "%d", _m+i ); } for( int i=1, j=0; t --; ++ i ){ scanf( "%d", &num ); // 快速 填充到指定数目的数 while( pri_max.size()+pri_min.size() < num ){ pri_min.push( _m[ j ++ ] ); } // 快速 填充 到最大堆, 使最大堆数目为 i while( pri_max.size() < i ){ pri_max.push( pri_min.top() ); pri_min.pop(); } // 交换 最大堆 和 最小堆 数据, 直到符合情况 while( pri_min.size() && pri_max.top() > pri_min.top() ){ num = pri_max.top(); pri_max.pop(); pri_max.push( pri_min.top() ); pri_min.pop(); pri_min.push( num ); } printf( "%d\n", pri_max.top() ); } delete [] _m; }
原文:http://www.cnblogs.com/seana/p/5369645.html