单调队列的基本运用模版
// 最后一个 >= 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; }