单调队列的基本运用模版

    // 最后一个 >= 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;
    }

猜你喜欢

转载自www.cnblogs.com/-Ackerman/p/13200479.html