单调队列的基本运用模版
Posted -ackerman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调队列的基本运用模版相关的知识,希望对你有一定的参考价值。
// 最后一个 >= a[i] 的数的位置 // 右边第一个 < a[i] 的数的位置 int cnt; q[1] = n + 1; cnt = 1; a[n + 1] = -INF; for (int i = n; i >= 1; i--) { while (cnt && a[q[cnt]] >= a[i]) cnt--; f1[i] = q[cnt] - 1; q[++cnt] = i; } // 左边第一个 < a[i] 的数的位置 q[1] = 0; cnt = 1; a[0] = -INF; for (int i = 1;i <= n;i++) { while (cnt && a[q[cnt]] >= a[i]) cnt--; f2[i] = q[cnt] + 1; q[++cnt] = i; } // 最后一个 <= a[i] 的数的位置 // 右边第一个 > a[i] 的数的位置 int cnt; q[1] = n + 1; cnt = 1; a[n + 1] = INF; for (int i = n; i >= 1; i--) { while (cnt && a[q[cnt]] <= a[i]) cnt--; f1[i] = q[cnt] - 1; q[++cnt] = i; } // 左边第一个 > a[i] 的数的位置 q[1] = 0; cnt = 1; a[0] = INF; for (int i = 1;i <= n;i++) { while (cnt && a[q[cnt]] <= a[i]) cnt--; f2[i] = q[cnt] + 1; q[++cnt] = i; }
以上是关于单调队列的基本运用模版的主要内容,如果未能解决你的问题,请参考以下文章