洛谷P7972 [KSN2021] Self Permutation 题解 笛卡尔树+DP

题目链接:https://www.luogu.com.cn/problem/P7972

解题思路:完全来自 rui_er 大佬的博客

示例程序:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const int maxn = 3e5 + 5;

int n, a[maxn], ls[maxn], rs[maxn], l[maxn], r[maxn];
ll f[maxn];

ll dfs(int u) {
    if (!u) return 0;
    dfs(ls[u]);
    dfs(rs[u]);
    f[u] = (f[ ls[u] ] + 1) * (f[ rs[u] ] + 1);
    l[u] = ls[u] ? l[ ls[u] ] : u;
    r[u] = rs[u] ? r[ rs[u] ] : u;
    if (l[u] > 1) f[u] += f[ rs[u] ];
    if (r[u] < n) f[u] += f[ ls[u] ];
    return f[u] %= mod;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", a+i);
    stack<int> stk;
    for (int i = 1; i <= n; i++) {
        int last = 0;
        while (!stk.empty() && a[stk.top()] > a[i]) {
            last = stk.top();
            stk.pop();
        }
        if (!stk.empty()) rs[stk.top()] = i;
        ls[i] = last;
        stk.push(i);
    }
    int rt;
    do {
        rt = stk.top();
        stk.pop();
    } while (!stk.empty());
    printf("%lld\n", dfs(rt));
    return 0;
}
posted @ 2026-09-03 16:12  quanjun  阅读(9)  评论(0)    收藏  举报