洛谷P16902 [CCO 2026] Melborp 题解 分治

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

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

有一丢丢 笛卡尔树 建树的思想在,

很神奇的一种双指针优化分治时间复杂度的思想。

示例程序:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 5e6 + 5;

int n, a[maxn];
ll b[maxn];

void dfs(int l, int r, int num) {
    if (l > r) return;
    bool flag = false;
    for (int i = l, j = r, k = 0; i <= j; k ^= 1) {
        int p = !k ? i++ : j--;
        ll tmp = 1ll * (p - l + 1) * (r - p + 1);
        if (b[p] >= tmp) {
            int x = b[p] > tmp;
            a[p] = num - x;
            dfs(l, p-1, num + 1 - x);
            dfs(p+1, r, num + 1 - x);
            return;
        }
    }
    assert(1 == 0);
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%lld", b+i);
    dfs(1, n, 1);
    for (int i = 1; i <= n; i++)
        printf("%d ", a[i]);
    return 0;
}
posted @ 2026-09-06 17:31  quanjun  阅读(6)  评论(0)    收藏  举报