「考试」省选80
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(Q\sqrt{Q}logQ)\)得了。
T3
很久之前做的状压题的正解打法。
我们把状态都找出来,然后发现\(n=3\)的时候有一个情况很特殊,第一格和第三格不属于同一个连通块和属于同一个连通块,这样要区分开。
最终状态一共有9个。
然后对于这些状态我们发现\(dp\)的转移可以用转移矩阵来表示,其中矩阵的每一个元素都是一个单项式。
这样我们的\(dp\)定义变成多项式。
然后发现直接乘复杂度爆炸了。
我们分别带入单位元然后做矩阵快速幂求出点值,然后再逆向\(IDFT\)插回\(dp\)数组定义的多项式就可以了。