2. 值域根号分治

2.2 例题

[ICPC 2025 Shanghai R] Round screws

Portal。

首先考虑修改时怎么考虑,假设原来相邻的三个数是 a,k,ba,k,b,将 kk 改成 tt,则 (axor⁡t)+(txor⁡b)≥(axor⁡t)xor⁡(txor⁡b)=axor⁡b(a\operatorname{xor} t)+(t\operatorname{xor} b)\ge (a\operatorname{xor} t)\operatorname{xor}(t\operatorname{xor} b)=a\operatorname{xor}b,构造一个使等号成立的 tt 只需要不让加法进位,即在 a,ba,b 两二进制位都为 11 时为 11,都为 00 时为 00,否则无关。

这样发现一次修改等价于删除。设 fif_i 代表以 aia_i 结尾的最小代价,则:

fi=min⁡k=0i−1{fk+C(i−k−1)+(aixor⁡ak)}f_i=\min_{k=0}^{i-1}\{f_k+C(i-k-1)+(a_i\operatorname{xor}a_k)\}

令 gk=fk−Ckg_k=f_k-Ck,等价于:

fi−Ci+C=min⁡k=0i−1{gk+(aixor⁡ak)}f_i-Ci+C=\min_{k=0}^{i-1}\{g_k+(a_i\operatorname{xor}a_k)\}

相当于维护一个数据结构,支持插入 (g,a)(g,a),查询时给定 tt 求 g+(axor⁡t)g+(a\operatorname{xor} t) 的最小值。如果我们直接暴力做的话我们记录给定的 aa 时 gg 的最小值,那么插入是 O(1)O(1) 而查询是 O(V)O(V) 的,看到这个值域范围不难想到围绕值域去做一些根号平衡。

让插入时多枚举一些信息,比如查询的数的一部分。这里枚举查询的数的二进制后 99 位。也就是说,我们维护 hH,Lh_{H,L} 表示查询的数的二进制后 99 位为 HH,插入的信息的二进制前 99 位为 LL,这样在插入时就可以直接统计后 99 位的贡献(因为这部分查询的数已知),查询的时候只需要维护前 99 位的贡献即可。代码。


Nothing built can last forever.
本站由 iznomia 使用 Stellar 1.30.4 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。