跳转至

地精排序:离散化与树状数组

出题人解法:向量排名、树状数组逆序对计数与前缀最小值次数。 Codex(GPT-6)补齐此方案的证明与 C++17 计算程序。它与归并计数同阶,使用不同的数据结构,两者并列介绍,归并方案仍作标程。

排名与顺序扫描

按二维向量的字典序排序,给每个向量唯一排名 \(r_i\) ,并映射回其原始位置。第一维相同时仍按第二维排序;不能用坐标和代替字典序。互异保证排名没有并列。

按原输入顺序扫描。树状数组保存已经处理的每个排名的出现次数。处理第 \(i\) 个向量前,数组中共有 \(i-1\) 个向量,因此

\[ d_i=(i-1)-\operatorname{Prefix}(r_i) \]

就是此前排名更大的向量数,恰为以当前位置为右端点的逆序对数。累加后再把当前排名加入树状数组,得到总逆序对数 \(I=\sum_i d_i\) .

另一次扫描记录严格前缀最小值次数 \(R\) :第一个向量计一次,此后仅当向量比当前最小向量还小时计数。

从逆序对到检查次数

沿用主题解的移动计数证明:相邻交换恰好消去一个逆序对,所以成功检查有 \(I\) 次;失败检查有 \(I+n-R\) 次。两者合计

\[ 2I+n-R \]

树状数组给每个逆序对按其右端点计数且恰计一次,前缀扫描准确求出 \(R\) ,因此结果正确。计数与最终答案使用 64 位整数。

复杂度与取舍

排序及树状数组操作共 \(O(n\log n)\) 时间,向量、排名和树状数组共 \(O(n)\) 空间。与归并计数的阶相同;此方案将计数转为扫描期间的前缀频次查询,更便于扩展到带插入的排名统计。代价是保存排名与额外数组,且必须先排序完成离散化。不能据同阶复杂度宣称哪种实现一定更快,当前完整范围的时间与空间见实测。

同输入测量

与标程在全部 10 份正式输入上的输出一致;五轮交替计时及输入、源码、程序哈希见完整记录,环境见参考评测环境。标程最慢中位耗时为 0.142160 秒,补充方案为 0.148444 秒;峰值工作集分别为 12.79 与 18.53 MiB,包含进程与运行库开销。 补充程序在全部已测正式输入上均低于 0.5 秒参考时限。该结论仅针对随附实现、这些输入与参考环境;有限测试不代替正确性证明,也不保证每一种同阶实现通过。