出题人解法:按最小间距分治,配合滑动窗口与八叉位树。 Codex(GPT-6)整理证明与 C++17 实现,显式处理长度一和分层度零,不改变核心算法。
设
枚举每个左端点,向右插入元素,维护当前最小间距。一旦间距不大于
向有序集合插入
同时为每个右端点
对
插入新元素前,如果它与当前窗口的前驱或后继距离小于
关键是要求间距恰好为
- 若严格小于,以
$L_d(r)$ 开头的窗口满足下界$d$ ,却不满足下界$d+1$ .数值为整数,所以其最小间距恰为$d$ ,用其长度更新答案。 - 若相等,这个最长窗口已经满足下界
$d+1$ .它的任何后缀也满足,因而以$r$ 结尾不存在最小间距恰为$d$ 的窗口。
一个数组即可从
分层度为零时,只要全序列有重复值,整个序列就是最长答案;否则答案为零。
用一棵完整八叉树表示整数值域。每个内部节点用八位掩码记录哪些儿子的子树非空,另记录每个值是否存在。插入、删除沿路径更新掩码;查找前驱或后继时,先向上寻找相邻非空分支,再沿最右或最左分支下降。预计算八位掩码的首、末非零位位置。
本题
间距大于阈值的所有合法区间都在短区间枚举中出现;小间距由上述左端点严格变化判据完整识别;零间距单独处理。这三类覆盖所有可能答案,且每次更新对应一个真实合法区间,故结果正确。
时间为
std.cpp 保留八叉位树;换用平衡树不会改善渐进复杂度,但节点分配与指针访问会改变常数,部署时应实测。
编译 std.cpp 后,用 python tests/generate.py --out-dir <目录> --std <程序路径> 生成数据及答案。tests/plan.json 覆盖单点、重复、交替、等距、排列和随机序列。独立校验直接枚举区间内全部数对。参考时限见评测环境与性能。