题意

给定一个数列

对于每一个,找两边的第一个比它大的值,然后在区间里找最大值,再在里找最大值。

思路

单调栈,再加一个判断。

Solution

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
#define sc(x) scanf("%d", &(x))
#define me(L) memset(L, 0, sizeof(L))
int L[N], R[N], st[N], a[N];
int main() {
    int n, t, T;
    sc(T);
    for (int ca = 1; ca <= T; ++ca) {
        sc(n);
        for (int i = 1; i <= n; ++i) sc(a[i]);
        st[t = 0] = 0;
        for (int i = 1; i <= n; ++i) {
            int maxx = -1, k = 0;
            while (t && a[st[t]] < a[i]) {
                if (maxx < a[st[t]]) maxx = a[st[t]], k = st[t];
                --t;
            }
            L[i] = k;
            st[++t] = i;
        }
        st[t = 0] = n + 1;
        for (int i = n; i; --i) {
            int maxx = -1, k = 0;
            while (t && a[st[t]] < a[i]) {
                if (maxx < a[st[t]]) maxx = a[st[t]], k = st[t];
                --t;
            }
            R[i] = k;
            st[++t] = i;
        }
        printf("Case %d:\n", ca);
        for (int i = 1; i <= n; ++i) printf("%d %d\n", L[i], R[i]);
    }
    return 0;
}