HDU6375双端队列

要点分析:

1.本题可以使用C++STL中的deque双端队列来方便解决(底层是一个双向的链表)

2.值得注意的是N的上限为150000,所以直接开这么大的空间会超内存,可以配合map一起使用

关于双端队列的声明:

使用<queue>头文件

主要用法:

deque.push_back(val);

deque.push_front(val);

deque.pop_front();

deque.pop_back();

deque.front();

deque.back();

deque.clear();

本题代码:

 1 #include<iostream>
 2 #include<queue>
 3 #include<map>
 4 using namespace std;
 5 
 6 //const int N = 150005;
 7 map<int, deque<int> > q;
 8 
 9 void read(int &x){
10     char ch = getchar();x = 0;
11     for (; ch < '0' || ch > '9'; ch = getchar());
12     for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
13 }
14 
15 int main(){
16     int N, Q;
17     while(scanf("%d%d", &N, &Q) != EOF){
18         for(int i = 1; i <= N; i++) q[i].clear();
19         for(int i = 1; i <= Q; i++){
20             int x;
21             read(x);
22             if(x == 1){
23                 int u, w, val;
24                 read(u);
25                 read(w);
26                 read(val);
27                 if(w == 0){
28                     q[u].push_front(val);
29                 }else{
30                     q[u].push_back(val);
31                 }
32             }else if(x == 2){
33                 int u, w;
34                 read(u);
35                 read(w);
36                 if(q[u].empty()){
37                     printf("-1\n");
38                 }else{
39                     if(w == 0){
40                         int temp = q[u].front();
41                         q[u].pop_front();
42                         printf("%d\n", temp);
43                     }else{
44                         int temp = q[u].back();
45                         q[u].pop_back();
46                         printf("%d\n", temp);
47                     }
48                 }
49             }else{
50                 int u, v, w;
51                 read(u);
52                 read(v);
53                 read(w);
54                 if(w == 0){
55                     while(!q[v].empty()){
56                         int temp = q[v].front();
57                         q[v].pop_front();
58                         q[u].push_back(temp);
59                     }
60                 }else{
61                     while(!q[v].empty()){
62                         int temp = q[v].back();
63                         q[v].pop_back();
64                         q[u].push_back(temp);
65                     }
66                 }
67             }
68         }
69     }
70     return 0;
71 }
posted on 2020-01-05 13:09  白泽talk  阅读(163)  评论(0编辑  收藏  举报