环
我们不妨考虑按0−n顺序的前缀和,记作数组D。于是D[i]就表示环上按顺时针方向从0号车站到i号车站的距离总和。为了后面方便的推导,我们再假设环的总长度(也就是答案)为X,于是便可得到如下的不等式约束(箭头后方是差分约束的标准形式):
由于相邻车站之间的距离是正整数,所以有:
D[i]+1≤D[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]≥L→D[S]−D[T]≤−L
2.S>T,X+D[T]−D[S]≥L→D[S]−D[T]≤X−L
同理对于第二种条件,也可以获得以下不等式关系:
1.S<T,D[T]−D[S]≤L→D[T]−D[S]≤L
2.S>T,X+D[T]−D[S]≤L→D[T]−D[S]≤−X+L
这是一个经典的差分约束模型。所有不等式约束可以转化为图论中最短路的模型,如果出现负环则说明该不等式组无解。
在这道题中,我们由于设了一个未知数X,所以似乎无法直接求解。但是我们不难发现给定一个答案X,我们可以在转化的图上跑bellman−ford或者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) = 1的x和y,不难利用A_x[]及A_y[]在O(xy)时间内构造出正确的A_{xy}[]。因此,现在的问题是,给定某个质数幂p^c,求出A_{p^c}[]的值。
考虑最直接的做法。对于每个[0, p^c)中的i,我们枚举k,计算出i-k^2中p的数量并累加,直到不少于c;A_{p^c}[i]就等于此时的k^2 + 1。由于k是O(\sqrt{x})的,总复杂度O(m \sqrt{hi})。
这样做的复杂度太高了,需要优化。注意到c的范围非常小,因此假如我们只枚举i-k^2中包含至少一个p的i和k,复杂度就会降低许多。因此,我们先枚举k,并维护一个cnt[i]表示到目前为止所有i-k^2中p的总个数;然后再枚举满足i \equiv k^2 \mod{p}的所有i,这样的i就只有p^{c-1}个了,单次求解的复杂度降至O(p^{c-1} \sqrt{hi})。
我们发现,每个k所影响的i以p为周期循环,k与k+p所影响的i是相同的;而每次每个受影响的i的cnt[i]至少会加一,因此有用的k只有p*c个。与算法二结合后,复杂度降至O(p^{c-1} * p * c) = O(p^c * c),由于c=O(\log m),总复杂度O(m \log m),可以通过本题。