关于双端队列初始边界

关于双端队列初始边界

首先要声明一下,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],那就是先操作队尾taila[i]入队,然后用q[head]更新当前答案,反之如果新的答案和当前元素无关就先更新答案再操作队尾入队。

顺序很重要的!

posted @ 2022-09-11 18:23  zjsqwq  阅读(33)  评论(0编辑  收藏  举报