HDU 1908 Double Queue
如题所示,考察的是双端队列。
题目很变态,题意要自己猜。
就是code为2的时候输出p最大的对应的k,code为3时输入p最小的对应的k。
查询的时候同时删除所查询的元素。
所以可以以<p,k>为键值,建立map<int,int> client,map会自动以p为基准进行升序排序。
用不来STL的童鞋自己去敲数组吧。
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 #include<stdlib.h> 5 #include<math.h> 6 #include<string.h> 7 #include<queue> 8 #include<map> 9 #include<vector> 10 #include<set> 11 #include<string> 12 13 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 14 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 15 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 16 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 17 #define swap(a,b) { int temp=(a) ; (a)=(b); (b)=temp; } 18 #define ll long long 19 20 int main() 21 { 22 int code,k,p; 23 map<int,int> client; 24 while( scanf("%d",&code) != EOF ) 25 { 26 if(code == 0) break; 27 else if(code == 1) 28 { 29 scanf("%d%d",&k,&p); 30 client[p] = k ; 31 } 32 else if(code == 2) 33 { 34 if( !client.empty() ) 35 { 36 printf("%d\n",( *client.rbegin() ).second); 37 client.erase( client.find( (*client.rbegin() ).first) ); 38 } 39 else printf("0\n"); 40 } 41 else if(code == 3) 42 { 43 if( !client.empty() ) 44 { 45 printf("%d\n",( *client.begin() ).second); 46 client.erase( client.begin() ); 47 } 48 else printf("0\n"); 49 } 50 } 51 return 0; 52 } 53
To Be The Best Of Yourself