T1
仓鼠讲的(dp)嵌套原题。
考虑对于一个确定的(T,V)如何(check)合法。
设(dp[i][a][b][c][d])为最高的前(i)位,(x)是否触及上界/下界,(y)是否触及上界/下界。
那么我们把这个状态压一下。
设(dp[i][S])为所有可以由状态的集合(S)得到的(V)的个数。
那么就可以转移了。
复杂度是(O(602^{16}2^6))
(if)剪掉大量的枝。
T2
按照步子分块。
小于等于(B)的部分我们开(B)个线段树存,打整体加法标记。
大于(B)的部分我们直接暴力模拟,用一个树状数组存,每次把位置大于(1e5)的跳蚤舍弃掉。
考虑复杂度,是(O(BQlogQ+frac{Q}{B}QlogQ))
这样的话我们的(B)取(sqrt{Q})比较优秀,复杂度就是(O(Qsqrt{Q}logQ))得了。
T3
很久之前做的状压题的正解打法。
我们把状态都找出来,然后发现(n=3)的时候有一个情况很特殊,第一格和第三格不属于同一个连通块和属于同一个连通块,这样要区分开。
最终状态一共有9个。
然后对于这些状态我们发现(dp)的转移可以用转移矩阵来表示,其中矩阵的每一个元素都是一个单项式。
这样我们的(dp)定义变成多项式。
然后发现直接乘复杂度爆炸了。
我们分别带入单位元然后做矩阵快速幂求出点值,然后再逆向(IDFT)插回(dp)数组定义的多项式就可以了。