随笔 - 136  文章 - 0  评论 - 82  阅读 - 10万

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   白泽talk  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示