百度之星初赛B hdu 6375 度度熊学队列

版权声明:本文为博主原创文章,爱转载的表明出处就好. https://blog.csdn.net/qq_36797743/article/details/81604274

题意

度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣。
初始时有 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 被清空。

题解

考虑链表
每一个队列记录一下队头的元素是哪一个,队尾是哪一个
然后每一个点,维护他相邻的两个是什么
当我们访问队头或者队尾的时候
他相邻的肯定有一个是空的
判断一下,就可以得到先后关系了
大概就是下一个update函数
如果x是队头
则判断

if(lst[x]!=0) swap(lst[x],nxt[x])

队尾同理
然后操作都直接做就可以了

只要注意我们维护的是相邻的元素,并不是严格的先后顺序就好了
细节有点多。。比赛的时候打错了一个字符调了很久QAQ

题解

不想重打了

猜你喜欢

转载自blog.csdn.net/qq_36797743/article/details/81604274