![算法训练营:提高篇(全彩版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/130/52921130/b_52921130.jpg)
训练 度度熊学队列
题目描述(HDU6375):度度熊正在学习双端队列,它对翻转和合并产生了很大的兴趣。初始时有n个空的双端队列(编号为1~n),度度熊的m次操作有3种类型。
操作①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被清空。
输入:输入多组数据。每组数据的第1行都为两个整数n和m。接下来有m行,每行都有3或4个数,含义如上。n≤1.5×105,m≤4×105,1≤u,v≤n,0≤w≤1,1≤val≤105;所有数据里m的和都不超过5×105。
输出:对于每组数据的每个操作②,都输出一行表示答案。若操作②的双端队列是空的,则输出-1且不执行删除操作。
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_1.jpg?sign=1739087756-8UG2eBGxOiyYhMNFuTky6g0UWOS1DVLJ-0-d83b256af0ad954fb89fa0cde1003c7e)
提示:由于读入的数据量过大,所以建议进行读入优化。一个简单的读入优化代码模板如下。
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_2.jpg?sign=1739087756-1NGrykn0Htcz0bQ72btChek1cvqPwdb9-0-f29fa797a11fcc4663fd499f4db54183)
1.算法设计
本题描述的是双端队列,可以用deque解决。
(1)定义一个双端队列类型的数组d[]。
(2)判断并分别执行3种操作。对于操作②,需要输出结果。
(3)对于操作③,由于双端队列不支持翻转,因此用反向迭代器实现翻转。
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_3.jpg?sign=1739087756-9d2GFqV2QEfLPSZgKHocY3p3RQVsdxHt-0-0d283eddf3af6b91dea575588d31f05b)
对本题也可以用list来处理。list是双向链表,双向链表支持翻转和拼接。首先定义一个双向链表类型的数组ls[],对于操作③,双向链表支持翻转,其拼接函数splice()可以将另一个链表v拼接到当前链表的pos位置之前,并自动清空原双向链表v,而且时间复杂度为常数。
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_4.jpg?sign=1739087756-nyWXLuqcA8Ckb6hpTlI1uYGvVK8qF0dz-0-350fc1ffd80f3a08cc6e47311a78a891)
2.算法实现
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_5.jpg?sign=1739087756-iJ8pr3psxZhdawUQR2qmAfoQ8WmhQUCV-0-ef0600a4b50a2d79b6c9dfa7c5f73d91)
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_6.jpg?sign=1739087756-qO6MQG4565pYUJ7ELQJu5pmA7v3o5Y2T-0-c51532c3f018a2d7c84eec3e6d69dcb6)