Codeforces 1601F - Two Sorts(折半搜索)

Codeforces 题面传送门 & 洛谷题面传送门

自己胡的,不知道对不对(

首先特判将所有 \(i\)\(n\) 的前缀的情况,这些 \(i\) 的贡献显然可以在若干个 \(\log\) 个时间内求出。在下文中,方便起见,我们假设 \(A_i\)\(n\) 的前 \(i\) 位组成的数。我们先枚举三个量,\(i\) 写成字符串后与 \(n\) 的 LCP 长度 \(x\)\(i\) 从左往右数第 \(x+1\) 位的值 \(v\)(由于 \(i\) 不是 \(n\) 的前缀,所以 \(i\) 必然存在第 \(x+1\) 位),以及 \(i\) 的长度 \(d+x+1\)。注意到这个 \(n\) 数据范围 \(10^{12}\),要么是给奇怪的状态压缩,要么是折半搜索,而前者好像也没啥好的状压方法,因此考虑后者。我们令 \(B=\dfrac{d}{2}\),我们先枚举前 \(B\) 位是什么,假设为 \(x\),那么对于一个 \(y\le 10^{d-B}\),数 \((10A_x+v)·10^d+x·10^{d-B}+y\) 的排名则可以写作 \(X+rk_{d-B,y}\),其中 \(rk_{d-B,y}\) 表示带前导零补全到 \(d-B\) 位的 \(y\)\(<10^{d-B}\) 的可以带前导零中的数的排名。于是枚举完 \(x\) 之后我们要求的可以转化为 \(\sum\limits_{y=0}^{10^{d-B}-1}(X+rk_{d-B,y}-((10A_x+v)·10^d+x·10^{d-B}+y))\bmod 998244353\)。令 \(Y=(10A_x+v)·10^d+x·10^{d-B}\),发现 \((X+Y)\bmod 998244353\) 是固定的,而根据 \(rk_{d-B-y}-y\) 的大小可以将 \((X+Y)\bmod 998244353+rk_{d-B-y}-y\) 分成 \([-998244353,-1],[0,998244352],[998244353,2·998244353-1]\) 三个区间,三个区间分别贡献 \(+998244353,0,-998244353\) 的贡献,排个序 lower_bound 一下即可。

posted @ 2022-08-08 17:09  tzc_wk  阅读(96)  评论(2)    收藏  举报