CF1246F Cursor Distance
考虑对于每一个,求出至多走步就能够到达它的位置所构成的区间。我们只要对每个分别求出就能得到答案。
最短路不一定是单向的(比如对于baaaaac,从b走到最后一个a),所以可能不独立,不能直接倍增计算的和。
进一步观察,的取值与中的位置有关的必要条件是的字符集大于的字符集;如果字符集相同,则就只与和的字符集大小有关。
对于每个,当从取到的时候,的字符集大小只会变化次(表示字符集大小)。故而,我们可以枚举当前这些区间的字符集大小,这时候是独立的,可以直接倍增求出它们的和。
实现细节上,在最外层枚举区间的字符集大小,然后对每个位置处理出——表示当为某个满足字符集大小为的位置,的时候,跳一步能够把扩展到哪里;以及类似定义的。预处理出倍增的结果。然后对每个从大到小枚举,然后看它现在的区间端点扩展次以后,区间内是否仍然只有种字符。
Code
LOJ6435 「PKUSC2018」星际穿越
参考这篇blog
设为从出发,走步能够到达的最靠左的点。则有。
显然。
然后是:
- 对于,可以在第一步走到;
- 对于,如果我们可以选择在第一步走到,否则,一定不会被取到。
对于,有。由于显然,所以也可以写作。这个式子中的取值与无关而只与有关,所以可以倍增求出时的和。
实现上,可以强制先走的第一步,这样的话之后的每一步的转移都满足
Code