洛谷 P1637 三元上升子序列 - Solution
给定长度为 $N$ 的序列,求满足 $i < j < k$ 且 $a[i] < a[j] < a[k]$ 的三元组个数。$N \le 10^5$,$a_i \le 10^9$。通过枚举中间位置 $j$,利用权值树状数组分别统计左右两侧的可行元素个数,$O(N \log N)$ 解决。
给定长度为 $N$ 的序列,求满足 $i < j < k$ 且 $a[i] < a[j] < a[k]$ 的三元组个数。$N \le 10^5$,$a_i \le 10^9$。通过枚举中间位置 $j$,利用权值树状数组分别统计左右两侧的可行元素个数,$O(N \log N)$ 解决。
介绍康托展开与逆康托展开的原理、公式推导和代码实现,涵盖排列排名计算、第 k 个排列生成,以及配合树状数组优化的 O(n log n) 解法。
康托展开 康托展开用于求 $1 \sim n$ 的排列在所有排列中的字典序排名,用树状数组维护未使用过的数中比当前数小的个数。预处理阶乘 $O(n)$,单次展开 $O(n \log n)$。 123456789101112131415161718...
汇总树状数组的常用代码模板:单点修改区间查询、逆序对(含离散化)、区间修改单点查询(差分)、区间修改区间查询(维护 b[i] 与 i·b[i]),并给出相关学习笔记链接。
从 lowbit 二进制拆分思想出发,介绍树状数组的单点修改、前缀和查询与区间修改操作,通过逆序对、区间和的经典例题讲解代码实现,并关联 P1637 三元上升子序列与康托展开等拓展应用。