洛谷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;
}
浙公网安备 33010602011771号