test1210

发布时间 2023-12-12 19:45:16作者: 小超手123

emm。好久没写这玩意了,来更一发。

img

游戏

题意:

给定一个DAG 以及起点 \(s\)。保证 \(s\) 能到达所有点。定义一条边 \(u \rightarrow v\) 的权值为 \(s\)\(v\) 最少经过的边数。求 \(s\) 到每个点的必经之边的权值最小是多少。

分析:

由于是 DAG,可以用拓扑排序跑 DP。

\(f_i\) 表示离 \(i\) 最远的必经之边的编号,如果没有就是 \(0\)

考虑对于一条边 \(e:x \rightarrow y\) 如何转移:

  • \(y\) 的入度为 \(1\):此时如果 \(f_{x}=0\),有 \(f_{y}=e\);否则,\(f_{y}=f_{x}\)
  • \(y\) 的入度大于 \(1\):如果所有 \(f_{x}\) 均相同,那么 \(f_{y}=f_{x}\);否则,\(f_{y}=0\)

情况 \(1\) 显然。情况 \(2\) 的证明如下:

这里令 \(f_{x_1} \ne f_{x_2}\)
显然 \(s\)\(x_1\)所有路径与 \(s\)\(x_2\)所有路径互不相交,否则一定存在一条到 \(x_1\)\(x_2\) 的路径同时经过 \(f_{x_1},f_{x_2}\),与 \(f\) 的定义矛盾。

于是不存在必经之边,即 \(f_{y}=0\)

时间复杂度 \(O(n+m)\)

棋盘

题意:

你有一个 \(n \times m\) 的棋盘,最初,棋盘上每个棋⼦都是正面朝上, 每次操作你可以选择⼀个 \(X \times Y\)的矩形,选择该矩形内的任意一些棋子翻转(正面朝上的变成反面朝上、反面朝上的变成正面朝上)。问你使用不超过两次操作能形成不同棋盘的方案数。

分析:

解决该问题需要一些巧妙的 dp 技巧。

从操作入手是困难的,因此从合法棋子布局入手。

如图,我们枚举红色长方形的长和宽,得到条件1:每条边都至少有一个棋子

这样就成功把方案分成了 \(nm\) 类。

条件2:每个棋子都必须在绿色的两个矩形内(即出现在左上角、右下角或者右上角、左下角)。

现在尝试计算出每一类的方案数。

当然可以大力容斥,不过这里提供一种优雅的解决方案:

对每个位置的棋子用一个 \(6\) 位二进制数表示(是否在矩形的上边,是否在矩形的左边,是否在矩形的右边,是否在矩形的下边,是否在左上角、右下角,是否在右上角、左下角)

对于我们选定的棋子所表示的数集合记为 \(S\)。显然,那么对 \(S\) 的前 \(4\) 位取与,后 \(2\) 位取或所得到的合法情况,只有 \(111110,111101,111111\) 这三种。

再记一个 \(cnt_i\) 表示所表示的数为 \(i\) 的位置的个数。然后就可以背包解决。

时间复杂度 \(O(nm(nm+2^{12}))\)

\(k\) 次多项式

题意:

我们称两个⻓度相同的序列 \(a_0,a_1,...,a_{n-1}\)\(b_0,b_1,...,b_{n-1}\) 相似,当且仅当存在⼀个不超过 \(k\) 次多项式 ,满足对所有 \(0 \le i < n\) 满足 \(P(i) \equiv (a_i-b_i)(\mod 998244353)\)

给定两个⻓度为 \(n\) 的序列 \(a\)\(b\),找到最小的 \(x\),使得 \(b_{x \mod n},b_{(x+1) \mod n},...,b_{x+n-1} \mod n\)\(a\) 相似。

\(n \le 10 ^ 5,k \le 10^9\)

分析:

根据拉格朗日插值的结论:

\[f(k)=\sum_{i=0}^{n}y_i\prod_{i\ne j} \frac{k-x_j}{x_i-x_j} \]

\(n\) 个点可以确定一个最高次为 \(n-1\) 的多项式。因此 \(k\) 大于等于 \(n-1\),直接输出 \(0\) 即可。

而判断 \(n\) 个点是否能 \(k\) 次多项式所表示的一种常见方法为差分法:

结论:对于一个多项式 \(z=f(k)-f(k-1)\)\(z\) 的最高次数必定比 \(f\) 这个函数的最高次数小 \(1\)

证明如下:

考虑 \(f(k)\)\(f(k-1)\) 的最高次项:\(ax^k\)\(a(x+1)^k\)

\(ax^k-a(x+1)^k=a(x^k-\sum_{i=0}^{k}C_{k}^{i} \times x^i)\)。显然减掉后 \(x^{k}\) 消失了。

于是可以差分 \(k+1\) 次,最后剩下全是 \(0\),就说明该多项式的最高次数小于等于 \(k\)

因此得到了一个 \(O(n^2k)\) 的做法,枚举 \(x\),差分 \(a_i-b_i\),判断是否全为 \(0\)。预计得分 \(0\)(滑稽。

枚举 \(x\) 是不明智的,只需要把 \(b\) 数组复制两遍,然后对 \(a,b\) 分别差分,最后判断是否相等即可。预计得分 \(90\)

\(k\) 阶差分可以用 NTT 解决,由于 \(k=\min(k,n)\),时间复杂度 \(O(n \log n)\)