标签:head 队列 双端 入队 ++ tail 情况 初始
关于双端队列初始边界
首先要声明一下,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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。