HDU6375双端队列

Posted findview

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
38                 }else{
39                     if(w == 0){
40                         int temp = q[u].front();
41                         q[u].pop_front();
42                         printf("%d
", temp);
43                     }else{
44                         int temp = q[u].back();
45                         q[u].pop_back();
46                         printf("%d
", 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 }

以上是关于HDU6375双端队列的主要内容,如果未能解决你的问题,请参考以下文章

HDU6375-度度熊学队列 双向链表

HDU 6319 Problem A. Ascending Rating 单调队列 STL 双端队列

HDU 5289 Assignment(多校2015 RMQ 单调(双端)队列)

hdu 5380 Travel with candy(双端队列)

hdu-5929 Basic Data Structure(双端队列+模拟)

HDU7068 Dota2 Pro Circuit(双端队列,模拟)