关于双端队列初始边界
作者:互联网
关于双端队列初始边界
首先要声明一下,deque
默认左闭右开,也就是入队时q[tail++] = x
的形式。有点反人类
我总结出的规律如下。可能是错的
分两种情况讨论:
情况1:要求队列里必须要有两个点,比如凸包需要访问q[tail]
和q[tail - 1]
,这种情况用STL太麻烦了。
情况2:要求队列里有一个点就够了,比如滑动窗口之类的,可以放心使用deque
。
三个点的没见过,等我见到了再说。
head, tail的初值
情况1:head = tail = 1
。
情况2:head = 1, tail = 0
。
终止条件
情况1:while (head < tail ...)
情况2:while (head <= tail ...)
入队操作
q[++tail] = x;
感觉q[tail++]
的太麻烦了,好好的访问q[tail]
非得再写成q[tail - 1]
,但其实本质和情况1的是一样的。
操作顺序
一定是最先把队首head
的超时元素删去。
之后依题意判断,如果新的答案需要用到当前的元素比如a[i]
,那就是先操作队尾tail
让a[i]
入队,然后用q[head]
更新当前答案,反之如果新的答案和当前元素无关就先更新答案再操作队尾入队。
顺序很重要的!
标签:head,队列,双端,入队,++,tail,情况,初始 来源: https://www.cnblogs.com/zjsqwq/p/16684527.html