跳转至

端倪发生器:出现位置二分方案

贡献:沿用出题人的前缀和分块思路;Codex(GPT-6)补齐完整块区间答案,并用出现位置二分去掉块乘值计数矩阵,给出证明与实现。二分查找是经典方法。本方案与主解并列,支持相同完整范围。

保留的统计与省去的矩阵

仍把零和子区间转为同值前缀位置对,按宽度 \(B=\lceil\sqrt{N+1}\rceil\) 分块,预计算每个完整块区间的距离和 \(H[s][t]\) .固定左块向右扫描,使用“已出现次数乘当前下标减去已出现下标和”累计,时间 \(O(NK)\) ,其中 \(K\) 为块数。

每个值 \(v\) 只保留有序出现下标表 \(J_v\) 及局部前缀和 \(Z_v\) ,不存 \(C[b][v]\) 矩阵。若完整中间区间为 \([F,G)\) ,通过两次二分求

\[ x=\operatorname{lower\_bound}(J_v,F),\qquad y=\operatorname{lower\_bound}(J_v,G). \]

这里 \(x,y\) 是从零开始的插入位置。则中间同值次数为 \(y-x\) ,下标和为 \(Z_v[y]-Z_v[x]\) .位置表按值连续存入扁平数组,每个值保留一个前缀零,避免大量小容器。

查询与正确性

询问前缀下标区间 \([L,R]\) 的中间完整块和两端散块划分与主解一致。中间配对查 \(H\) ;左散点 \(i\) 与中间配对贡献为 \(z-ci\) ,右散点为 \(ci-z\) ;按递增顺序扫描两端散点,用临时次数和下标和补齐所有散块配对。没有完整中间时直接扫描至多两块。每个值的中间统计在当前查询内缓存一次,结束后只清除访问过的临时项。

有序位置表中,大于等于 \(F\) 且小于 \(G\) 的元素恰好处于插入位置 \(x\) 到 \(y-1\) .因此二分得到的次数和下标和与主解矩阵完全一致。完整块、交叉、散块三类位置对仍互斥且穷尽;结合零和与同值前缀的一一对应,答案正确。上一答案精确解码下一查询的归纳同样适用。

复杂度与取舍

预处理 \(O(N\log N+NK)\) ,每问 \(O(B\log(N+1))\) 最坏时间,空间 \(O(N+K^2)\) .平方根块宽下空间为 \(O(N)\) ,相对于主方案的 \(O(N\sqrt N)\) 矩阵有明确优势。实际二分长度是该值的出现次数;重复散点使用缓存,不重复二分。

位置前缀和、配对贡献、完整答案及异或使用六十四位,界与主解相同。本方案通过全部正式范围,适合较小内存或块乘值矩阵缓存命中较差的场合;主解具有更好的每问最坏渐进时间。五轮时间及实际内存见测量记录,不根据某一份输入断言其中一方在所有分布上更快。

程序:alternative.cpp。全部正式答案与主方案及独立莫队核验一致,小规模另用子区间枚举检查。