pyyz2023省选前模拟赛

T1:
最小割板子题。会构造就行。

构造方法口胡了一个,就是把没有流量的边删掉,找到每一条满足一个端点和 S 在一个连通块内,另一个端点不在的边,把这些都拿出来即可。

T2:
魔怔高精度题。题意就是玩汉诺塔,要求从初状态变为末状态的最小步数,\(3\times 10^5\)

首先一个显然的性质,操作可逆,也即你可以对初状态操作,同时对末状态操作,两个相等时就是合法方案。

简单考虑,从 \(n\)\(1\) 依次看圆盘是否在相同的位置上,相同的可以直接丢掉不用管。

找到第一个不相同的,那么我们要做的就是把初状态中这个盘和末状态中这个盘移到同一个柱子上。

考虑怎么移。显然你可以先枚举一个柱子,然后不管怎么样,你要把 \([1,i-1]\) 这些全部移到一个柱子上(这点显然,因为你要移动这个盘,就已经有两个柱子不能有更小的盘),那么你只需要设 \(f(i,t,0/1)\) 表示你将 \(0/1\) (即 初/末)状态的前 \(i\) 个盘移到柱子 \(t\) 上花费的最小代价。

转移是显然的。你考虑下一个从 \(i\)\(i+1\) 的转移,如果不需要换柱子,就是直接继承,否则相当于把 \(i\) 个圆盘从一个柱子移到另一个柱子,方案数是 \(2^i -1\)

最后枚举初始移到哪个柱子,取最小值即可。

然后需要实现高精,操作时用二进制方便模拟,结束时需要进制转换,可以压位或者分治 FFT,但是这部分出的就很垃圾。感觉不如原神。

T3:
阴间构造题。

感觉 \(n,m\le3\) 的部分分都是垃圾的,不好写的,遂摆烂之。

每行每列只有一个是简单的,判断是否有空行或者空列,有的话就全用这个匹配,否则就无解。

题解又臭又长还没看。

Day?

T2:考虑先确定出最小值或者最大值。首先全局q2得到极差,然后二分查询前缀 \([1,mid]\) 看是否包含极差,就可以二分出一个最大/小值位置。

然后考虑确定剩下的位置和最大/小值的差。

显然可以通过两次 qry 得到所有其他数和最值的差值。

枚举二进制下每一位,通过 2 次 q2 得到二进制下这一位是 1 的所有位置和最值的差值。这一位是 0 的可以通过所有数-为 1 的集合得到。

然后每个位置的值就是对应二进制下所有集合的交集。

最后两次 q1 得到这个值,以及任意另一个值得到这个值是最大还是最小即可。

Day??

总结:T1因为多测,使用重载运算符传参的复杂度会爆炸,应该手动实现的。

T2只会容斥没想递推,寄。

T3感觉能做,但是复杂度很容易多设个状态就原地升天。

T1

简单原题。随机一个长度为 \(n\) 的向量矩阵 \(D\),根据矩阵乘法的性质只需判断 \(D \times A\times B = D\times C\) 是否成立即可。

可以发现错误率极小,可以通过多次随机保证正确性。

T2

首先注意到,你钦定前 \(m\) 个数选的后面的哪些数,那么答案就变成了:

\[ans = A(n-m,m)\times f_{n-m,m} \]

其中 \(f_{i,j}\) 表示考虑长为 \(i\) 的排列,其中 \(j\) 个位置无限制。

发现 \(f_{i,j}\) 有递推公式。

当第 \(j\) 个数满足 \(p_j=j\) 时,可以 \(f_{i,j}=f_{i-1,j-1}\)

当满足 \(p_j \not= j\) 时,即这个位置也是错排,可以 \(f_{i,j}=f_{i,j-1}\)

那么整个柿子就是 \(f_{i,j}=f_{i,j-1}+f_{i-1,j-1}\)

发现可以对于 \(j\),将 \(f_{i,j}\) 当作多项式的系数得到多项式 \(F_j\)

那么容易发现 \(F_0\) 的系数就是错排,\(F_i=(x+1)F_{i-1}\)

那么你需要求 \(F_i=(x+1)^i F_0\) 的第 \(j\) 项,这个事情是经典的多项式优化形式。

发现直接算不好做,可以考虑分块,预处理出 \(F_{iB}\) 这些柿子,然后用 \(O(B)\) 的递推算出答案。

于是直接 NTT 即可。

T3

考虑 \(m=0\) 怎么做。从高位到低位考虑,如果有一个值已经在某一位小于上界了,那么以后的异或值可以通过这个值保证为 \(C\),于是只需要考虑前 \(i\) 位都和上界相同的情况,然后枚举下一位中第一个比上界小的,后面的这一位开始和前面的下一位开始即可任选。

考虑通过容斥解决边的限制。直接枚举哪些边不合法是不可接受的,但是我们可以枚举连通块。

一个连通块的取值取决于他 \(a_i\) 最小的那个值。于是可以设 \(f_{S1,S2}\) 表示当前已经将 \(S1\) 集合中的点考虑进连通块,\(S2\) 中的点是我们每个连通块的最小值集合。

注意集合大小是偶数的可以丢掉不管(不考虑进 \(S2\))。

转移只需枚举下一个连通块集合 \(S'\) 即可。容易发现因为 \(S2,S'\) 没有交集,这个 dp 是 \(O(4^n)\) 的。注意实现上两个点 \(a_i\) 相同按编号判断大小。

然后问题就是求 \(g_S\) 表示使 \(S\) 这个集合连通的所有边集的 \((-1)^{|G|}\) 之和,其中 \(|G|\) 表示边集大小。

这个是较为经典的问题。先考虑 \(S\) 的导出子图,容易计算出其中边任选的答案(实际上因为组合数 \(\sum C(n,i+i+1)=\sum C(n,i+i)\) 的性质,只要有边存在这个答案就是 0,否则答案是 1)。然后考虑枚举包含固定点子集 \(T\),将答案减去所有 \(T\) 联通,外面导出子图的边任选的贡献即可。

最后计算答案已经变成了 \(m=0\) 的情况。

实现上,我们可以直接设 \(f_{S}\),用 \(S\) 来包含 \(S1,S2\)(三进制状压即可)。这样空间不会爆炸。

复杂度 \(O(4^n + 3^n poly(n))\)

posted @ 2023-03-13 19:55  infinities  阅读(35)  评论(0编辑  收藏  举报