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  
HDU 1908

 

posted on 2013-09-30 23:37  码农之上~  阅读(181)  评论(0编辑  收藏  举报

导航