度度熊学队列

Posted zllwxm123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了度度熊学队列相关的知识,希望对你有一定的参考价值。

度度熊学队列

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 998    Accepted Submission(s): 328


Problem Description
度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣。

初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作。

1 u w val 在编号为 u 的队列里加入一个权值为 val 的元素。(w=0 表示加在最前面,w=1 表示加在最后面)。

2 u w 询问编号为 u 的队列里的某个元素并删除它。( w=0 表示询问并操作最前面的元素,w=1 表示最后面)

3 u v w 把编号为 v 的队列“接在”编号为 u 的队列的最后面。w=0 表示顺序接(队列 v 的开头和队列 u 的结尾连在一起,队列v 的结尾作为新队列的结尾), w=1 表示逆序接(先将队列 v 翻转,再顺序接在队列 u 后面)。且该操作完成后,队列 v 被清空。
 

 

Input
有多组数据。

对于每一组数据,第一行读入两个数 N 和 Q

接下来有 Q 行,每行 3~4 个数,意义如上。

N150000,Q400000

1u,vN,0w1,1val100000

所有数据里 Q 的和不超过500000
 

 

Output
对于每组数据的每一个操作②,输出一行表示答案。

注意,如果操作②的队列是空的,就输出1且不执行删除操作。
 

 

Sample Input
2 10
1 1 1 23
1 1 0 233
2 1 1
1 2 1 2333
1 2 1 23333
3 1 2 1
2 2 0
2 1 1
2 1 0
2 1 1
 

 

Sample Output
23
-1
2333
233
23333
提示 由于读入过大,C/C++ 选手建议使用读入优化。 一个简单的例子:
void read(int &x){
   char ch = getchar();x = 0;
   for (; ch < ‘0‘ || ch > ‘9‘; ch = getchar());
   for (; ch >=‘0‘ && ch <= ‘9‘; ch = getchar()) x = x * 10 + ch - ‘0‘;
}
 
模拟题
 
 
 
 1 #include <bits/stdc++.h>
 2 #define N 150010
 3 using namespace std;
 4 int n,m;
 5 // deque<int> q[N];
 6 int main(){
 7     while(~scanf("%d%d",&n,&m)){
 8         deque<int> q[n+1];
 9         // init();
10         for(int i=0;i<m;i++){
11             int k,u,v,val,w;
12             scanf("%d",&k);
13             if(k==2){
14                 scanf("%d%d",&u,&w);
15                 if(q[u].empty()){
16                     printf("-1
");
17                 }else{
18                     if(w==0){
19                         printf("%d
",q[u].front());
20                         q[u].pop_front();
21                     }else{
22                         printf("%d
",q[u].back());
23                         q[u].pop_back();
24                     }
25                 }
26             }else{
27                 if(k==1){
28                     scanf("%d%d%d",&u,&w,&val);
29                     if(w==0){
30                         q[u].push_front(val);
31                     }else{
32                         q[u].push_back(val);
33                     }
34                 }else{
35                     scanf("%d%d%d",&u,&v,&w);
36                     if(w==0){
37                         while(!q[v].empty()){
38                             int x = q[v].front();
39                             q[u].push_back(x);
40                             q[v].pop_front();
41                         }
42                     }else{
43                         while(!q[v].empty()){
44                             int x = q[v].back();
45                             q[u].push_back(x);
46                             q[v].pop_back();
47                         }
48                     }
49                 }
50             }
51         }
52     }
53     return 0;
54 }

 

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

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

度度熊学队列

hdu 6375 度度熊学队列 (链表模拟)

2018百度之星初赛(A)1002 度度熊学队列

2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope

# Java 常用代码片段