qwq的博客

博客

题解

2022-02-02 11:27:28 By qwq

我们不妨考虑按0n顺序的前缀和,记作数组D。于是D[i]就表示环上按顺时针方向从0号车站到i号车站的距离总和。为了后面方便的推导,我们再假设环的总长度(也就是答案)为X,于是便可得到如下的不等式约束(箭头后方是差分约束的标准形式)

由于相邻车站之间的距离是正整数,所以有:

D[i]+1D[i+1]D[i]D[i+1]1

不难发现D[0]=0,D[n]=X,所以我们又可以得到以下式子:

D[0]+X=D[n]D[0]D[n]<=X,D[n]D[0]<=X

对于题目给的第一种条件,我们根据按照顺时针方向是否跨越过0号车站,分类讨论一下,也不难建立不等式关系:

1.S<T,D[T]D[S]LD[S]D[T]L

2.S>T,X+D[T]D[S]LD[S]D[T]XL

同理对于第二种条件,也可以获得以下不等式关系:

1.S<T,D[T]D[S]LD[T]D[S]L

2.S>T,X+D[T]D[S]LD[T]D[S]X+L

这是一个经典的差分约束模型。所有不等式约束可以转化为图论中最短路的模型,如果出现负环则说明该不等式组无解。

在这道题中,我们由于设了一个未知数X,所以似乎无法直接求解。但是我们不难发现给定一个答案X,我们可以在转化的图上跑bellmanford或者spfa来判断是否存在负环,从而判断该答案是否可行。但显然答案的范围可能很大,枚举验证的方法效率不高,我们不妨采用以下两种思路来解决问题。

不难发现最终的答案其实是在一个区间范围之内。于是我们如果设计出一个算法来判断一个不合法的X是低于下界还是高于上界,便可以进行二分求解出最终答案的区间。

对于一个不可行的答案,我们必然是可以在转化的图中找到一个负环的。于是我们不妨在求最短路的时候对于每一个值都记录下X的系数,那当我们找到一个负环的时候,我们也可以得到该负环数值中的X的系数。如果X的系数是正的话,那么显然我们只有将X调大,才能使该负环变成非负环,所以该X的值是低于答案的下界。同理,如果X的系数为负,可以得到该X高于答案的上界。值得注意的是,如果存在一个负环X的系数为0便会无解

至此,我们可以使用二分算法,对上界和下界分别进行二分便可获得答案区间。时间复杂度为O(nmlogn)

我们注意到,一个方块的具体颜色对转移并没有太大影响,只要处理相邻颜色相同的就可以了(也可以理解为相对颜色)。

我们定义状态dpi,k,a为高度为i,已经有k对相邻方块颜色相同,顶面相对颜色序列为a的方案数。

对于这里的序列a,我们以如下方法构造。先为顶层的方块编号,编号为1的方块的相对颜色定义为1

然后以编号从小到大顺序枚举,如果当前方块的颜色在之前没有出现过,便将其编号为之前所有编号的最大值+1如果当前方块的具体颜色在以前出现过,就用以前出现的编号。

枚举最上面一层以及第二层的相对颜色,计算并更新相邻方块颜色相同的个数,直接叠加即可。

由于H过大,上文的算法显然会超时,因此我们要挖掘一些性质。

我们发现,转移方程是线性的,且i不会影响转移方程的形式。因此我们使用矩阵乘法+快速幂优化。

m=a×(K+1)+1

我们可以构造1×m矩阵a为每种状态初始的方案数,再定义m×m矩阵b为动态规划中任意两种状态转移的常数,并用最后一个位置记录每一种高度的方案的和。

答案显然为a×bh的最后一项。

我们可以将题目中的要求转化为求[1,T]中满足F(x) \equiv 0 \pmod{m}x个数。不难发现,F(x) \mod{m}仅与x \mod{m}k的最大值有关,且假如F(x) \equiv 0 \mod{m},那么就有F(x + m) \equiv 0 \mod{m}。因此,我们可以对所有的x按模m的余数进行分类,并计算出每一类x中满足条件的下界是多少,就能得到答案了。设这个下界为A_m[]

此外,对于一组满足(x, y) = 1xy,不难利用A_x[]A_y[]O(xy)时间内构造出正确的A_{xy}[]。因此,现在的问题是,给定某个质数幂p^c,求出A_{p^c}[]的值。

考虑最直接的做法。对于每个[0, p^c)中的i,我们枚举k,计算出i-k^2p的数量并累加,直到不少于cA_{p^c}[i]就等于此时的k^2 + 1。由于kO(\sqrt{x})的,总复杂度O(m \sqrt{hi})

这样做的复杂度太高了,需要优化。注意到c的范围非常小,因此假如我们只枚举i-k^2中包含至少一个pik,复杂度就会降低许多。因此,我们先枚举k,并维护一个cnt[i]表示到目前为止所有i-k^2p的总个数;然后再枚举满足i \equiv k^2 \mod{p}的所有i,这样的i就只有p^{c-1}个了,单次求解的复杂度降至O(p^{c-1} \sqrt{hi})

我们发现,每个k所影响的ip为周期循环,kk+p所影响的i是相同的;而每次每个受影响的icnt[i]至少会加一,因此有用的k只有p*c个。与算法二结合后,复杂度降至O(p^{c-1} * p * c) = O(p^c * c),由于c=O(\log m),总复杂度O(m \log m),可以通过本题。

Comments

No comments yet.

Post a comment

You can use @mike to mention the user mike.

If you wish to input the '@' character, please use @@