返回顶部

近期练习(简单记录)

ARC151-A

给定两 \(01\) 序列,求与两序列汉明距离相同的字典序最小 \(01\) 序列?

初始化为全 \(0\) 序列,倒序遍历,贪心的修改为 \(1\),使得汉明距离相等。

ARC151-B

给定一个排列 \(P\),求满足 \(1 \le A_i \le m\) 并且 \(A\) 小于 \((A_{P1},A_{P2},...,A_{PN})\) 条件的序列 \(A\) 的个数?

存在 \(n\) 对关系 \((A_1, A_{P1}), (A_2, A_{P2}), ..., (A_n, A_{Pn})\),令 \(f[i]\) 表示前 \(i-1\) 对关系都是相等,第 \(i\) 对关系为小于时的方案数。
\(f[i] = \frac{m * (m - 1)}{2} * m^{t}\), 相等的位置可以合并至同一集合,其中 \(t\) 为可以填写任意数的集合个数,可以表示为 \(n - 2 -\) 并查集的边数。
\(ans = \sum\limits_{i=1}^nf[i]\)

ARC151-C

给定 \(1 * n\) 的棋盘,其中有 \(m\) 个方格填了 \(0\)\(1\),现在 \(A\)\(B\) 博弈,交替在空方格中填数字(\(0\)\(1\)),且不能使得相邻的方格填相同的数,先不能操作的人输,问谁赢?

棋盘被划分成若干个空区域,每个空区域的sg函数异或和为 \(1\) 先手必胜。
空区域的sg函数与两端的数字有联系,故分成下面 \(4\) 类讨论:

  • 两侧没有填过数:分奇偶讨论。奇数时,先手填中间,后手怎么下,就在对称的另一侧模仿,先手必胜;偶数时,后手根据分界线对称模仿先手,先手必败。
  • 两侧填同一种数:两侧假设是 \(1\),分奇偶讨论。奇数时先手填中间,同理模仿对手必胜;偶数时,先手可以在左侧第二个位置填一个 \(0\),给对手一个两端不同,中间偶数格的必败态。故 \(sg=1\)
  • 两侧填不同种数:分奇偶讨论。偶数时,后手可以对称模仿对手必胜;奇数时,无论怎么填,都会给对手一个两端相同数的必胜态和一个两侧不同数的状态,所以必败。故 \(sg=0\)
  • 单侧填数:也就是左右两个边界,不论怎么填,都会产生一段上述两种状态之一+另一段单侧填数的状态,长度为 \(n\) 的空段可以转移到 \(sg = 0,1,2,...,n-1\),故 \(sg = n\)

ARC151-D

给定长度为 \(2^n\) 的序列 \(A\),给 \(q\) 次询问 \((x_i, y_i)\),每次询问对 \(j = 0, 1, 2, ..., 2^n - 1\) 进行如下操作:

  • \(j = b_{n-1}b_{n-2}...b_{0}\),令 \(j'\) 为将 \(j\)\(b_{xi}\) 翻转后的结果
  • 如果 \(b_{xi}=y_i\),则 \(A_{j'} += A_j\)

输出所有操作后的 \(A\)

首先可以把二进制表示仅有第 \(i\) 位不同的数字对间连一条标记为 \(i\) 的边,每次操作 \((x_i, y_i)\) 即对所有标记为 \(x_i\) 的边的两个端点操作。
可以发现对于 \(x_i\) 不同的操作,他们的顺序不会影响答案,于是把相同 \(x_i\) 的操作合并到一起(内部顺序不变),按照 \(x_i = 0, 1, 2, ..., n - 1\) 的顺序依次执行所有操作。
考虑对于相同 \(x_i\) 的操作如何快速计算:
假设 \(x_1 = x_2 = ... = x_q = 0\),令 \(A^{(i)} = (A_0^{(i)}, A_1^{(i)}, ..., A_{2^n-1}^{(i)})\) 表示执行完前 \(i\) 个操作的结果。
\(M_0 := \begin{bmatrix}1&0\\1&1\end{bmatrix}, M_1 := \begin{bmatrix}1&1\\0&1\end{bmatrix}\)
则对于任意的 \(k = 0, 1, 2, ..., 2^{n-1}\)\(\begin{bmatrix}A_{2k}^{(i)}\\A_{2k+1}^{(i)}\end{bmatrix} = M_{yi}\begin{bmatrix}A_{2k}^{(i - 1)}\\A_{2k+1}^{(i - 1)}\end{bmatrix}\)
故对于任意的 \(k = 0, 1, 2, ..., 2^{n-1}\)\(\begin{bmatrix}A_{2k}^{(q)}\\A_{2k+1}^{(q)}\end{bmatrix} = M_{yq}M_{yq-1}...M_{y1}\begin{bmatrix}A_{2k}^{(0)}\\A_{2k+1}^{(0)}\end{bmatrix}\)
于是先计算出 \(M_{yq}M_{yq-1}...M_{y1}\),然后递推 \(A^{(q)}\) 每个元素即可,同理,对于其他 \(x_i\) 的情况也是这样处理。

ARC150-A

给定一个字符串,仅包含 \(0, 1, ?\),其中 \(?\) 可以替换成 \(0\)\(1\),询问是否能找到唯一的方案,使得串仅有 \(k\)\(1\), 且这 \(k\)\(1\) 连续?

枚举连续段 \([i, i + k - 1]\),判断 \([1, i - 1]\) 不包含 \(1\)\([i + k, n]\) 不包含 \(1\)\([i, i + k - 1]\) 不包含 \(0\) 即合法。统计 \(0\)\(1\) 的前缀个数即可。

ARC150-B

给定两个正整数 \(A\)\(B\),最小化 \(X + Y\) 使得非负整数 \(X\)\(Y\) 满足 \(B + Y\)\(A + X\) 的倍数,求最小的 \(X + Y\) ?

\(\frac{B + Y}{A + X} = k(k \ge 1)\)
\(Y = kX + kA - B\)
\(X + Y = (k + 1)X + kA - B\),最小化 \(X\) 来使得 \(X + Y\) 最小化
因为 \(X, Y \ge 0\),即 \(kX + kA - B \ge 0\)
\(X = max(0, \left\lfloor\dfrac{B - 1}{k}\right\rfloor + 1 - A)\)
问题转化为找到 \(k\) 的取值最小化 \((k + 1)max(0, \left\lfloor\dfrac{B - 1}{k}\right\rfloor + 1 - A) + kA - B\)
考虑最小化上式,需要考虑 \(\left\lfloor\dfrac{B - 1}{k}\right\rfloor\),这是一个整除分块的形式,不同的值只有 \(O(\sqrt B)\)
故可以枚举每个结果相同的 \(k\) 的取值区间 \([l, r]\)\(k\) 取左端点 \(l\) 即可找到最小值,\(k\) 的取值范围是 \([1, B]\),超过 \(B\) 一定不会更优。

ARC150-C

给定一个 \(n\)\(m\) 边的无向联通图,一个长度 \(n\) 的序列 \(A\),一个长度 \(k\) 的序列 \(B\),判断是否满足:对于每一条从 \(1\)\(n\) 的简单路径 \(v = (v_1, v_2, ..., v_k)\),使得 \(B\)\((A_{v1}, A_{v2}, ..., A_{vk})\) 的一个子序列?

\(f[i]\) 表示从起点 \(1\) 到点 \(i\) 的简单路径最少已经匹配了序列 \(B\) 的前多少位
\(f[v] = min\{f[v], f[u] + (f[u] < k \; and \; A[v] == B[f[u] + 1])\}\)\(f[1] = (A[1] == B[1])\)
\(f[n] = k\),则满足条件

ARC143-C

给定 \(n\) 堆石子,第 \(i\) 堆有 \(A_i\) 个石子,A 和 B 博弈,A 先手,两个人轮流执行操作:选择一堆或多堆石子,A 操作时从每堆移走 \(X\) 个,B 操作时从每堆移走 \(Y\) 个,谁先不能操作即输掉游戏,问谁赢?

\(B_i = A_i \; mod \; (X + Y)\)
如果所有 \(B_i\) 都小于 \(X\),后手必胜,先手选择的每一堆,在操作后 \(B_i\) 至少剩 \(Y\),于是后手可以选择同样的几堆进行操作,保持两人操作完 \(B_i\) 不变。
如果 \(X \le Y\),如果存在 \(B_i\) 大于等于 \(X\),则先手必胜,先手选择所有 \(B_i \ge X\) 的堆进行操作,给后手一个所有 \(B_i\) 都小于 \(Y\) 的状态。
如果 \(X > Y\),此时必须选择 \(B_i\) 大于等于 \(X\) 的堆,然后根据剩下的状态判断输赢。

ARC146-C

有多少集合 \(S\)\(0\)\(2^n - 1\) 之间的非负整数组成,满足以下条件:
\(S\) 的每个非空子集 \(T\) 至少满足以下两个条件之一:

  • 集合 \(T\) 元素个数为奇数
  • 集合 \(T\) 元素的异或和不为 \(0\)

满足集合 \(S\) 的所有偶数大小的子集 \(T\) 的异或和不为 \(0\)
考虑对于一个已经满足条件的集合 \(S\),添加一个新的元素 \(x\) 得到的新集合仍满足条件,即新加入的元素 \(x\) 不能等于集合中奇数大小的子集的异或值。那么可以新加入的元素种类为:$2^n - $ 集合 \(S\) 中奇数大小的子集的异或值种类数。
考虑如何计算集合 \(S\) 中奇数大小的子集的异或值种类数,可以发现,不存在两个奇数大小的不同子集 \(X\)\(Y\) 它们的异或值相同,否则,这两个子集一定可以拼出一个偶数大小且异或值为 \(0\) 的集合是 \(S\) 的子集,于是,集合 \(S\) 中奇数大小的子集的异或值种类数即为集合 \(S\) 中奇数大小的子集数,即 \(2^{size - 1}\) 种。
于是,令 \(dp[i]\) 为大小是 \(i\) 的满足条件的集合数,故:

\[ dp[i] = \begin{cases}dp[i-1] * 2^n)\;\;(i=1)\\\dfrac{dp[i - 1] * (2^n - 2^{i-2})}{i}\;\;(i>1)\end{cases} \]

当集合大小为 \(n + 1\) 时,奇数大小的子集的异或值种类数为 \(2^n\),故不能再加入元素,答案即为:\(ans = \sum\limits_{i=0}^{n + 1} dp[i]\)

ARC141-C

给定排列 \(P = (P_1, P_2, ..., P_{2n})\)\(Q = (Q_1, Q_2, ..., Q_{2n})\),找到括号序列 \(S=S_1S_2...S_{2n}\) 满足:

  • \(P\) 是字典序最小的排列满足 \(S_{P_1}S_{P_2}...S_{P_{2n}}\) 是合法括号序列
  • \(Q\) 是字典序最大的排列满足 \(S_{Q_1}S_{Q_2}...S_{Q_{2n}}\) 是合法括号序列

如果 \(P_{2i - 1} > P_{2i}\),一定有 \(S_{P_{2i-1}} =\) (\(S_{P_{2i}} =\) ),否则可以交换 \(P_{2i-1}\)\(P_{2i}\) 来使 \(P\) 更小
如果 \(Q_{2i - 1} < Q_{2i}\),一定有 \(S_{Q_{2i-1}} =\) (\(S_{Q_{2i}} =\) ),否则可以交换 \(Q_{2i-1}\)\(Q_{2i}\) 来使 \(Q\) 更大
可以证明,如果存在超过一个候选 \(S\),则不存在满足条件的 \(S\)
故当只有一个候选的 \(S\) 时,贪心的构造 \(P\)\(Q\) 观察是否匹配即可

ARC139-C

给定 \(n\)\(m\),找到一个最长的序列 \(((X_1, Y_1), (X_2, Y_2), ..., (X_k, Y_k))\) 满足:

  • \(1 \le X_i \le n\)
  • \(1 \le Y_i \le M\)
  • \(X_i + 3Y_i \ne X_j + 3Y_j\) 并且 \(3X_i + Y_i \ne 3X_j + Y_j\),当 \(i \ne j\)

构造一个形如下图的摆放点的方法:
oooxxxxxxxxxxxx
oooxxxxxxxxxxxx
oooooxxxxxxxxxx
xxoooxxxxxxxxxx
xxoooooxxxxxxxx
xxxxoooxxxxxxxx
xxxxooooooooooo
即使得 \(3X + Y\) 每次只增加 \(1\),可以从 \((X, Y)\) 走到 \((X, Y + 1)\) 或者 \((X + 1, Y - 2)\);
使得 \(X + 3Y\) 每次只增加 \(1\),可以从 \((X, Y)\) 走到 \((X + 1, Y)\) 或者 \((X - 2, Y + 1)\)
于是可以构造出上图的摆放方式

ABC238-E

有一个长度为 \(n\) 的未知序列 \(a\),已知 \(q\) 条信息 \((l_i, r_i)\),即 \(a_{l_i} + a_{l_{i + 1}} + ... + a_{r_i}\) 的值,是否可以求出 \(a_1 + a_2 + ... + a_n\) 的值

\(sum[i]\) 为序列的前缀和,需要求 \(sum[n]\)
对于每条信息,即 \(sum[r_i] - sum[l_{i - 1}]\) 已知,当其中一个已知,即可求出另一个,于是问题转化为存在一些 \((l_{i - 1}, r_i)\) 的双向边,问是否能从 \(0\) 走到 \(n\)

posted @ 2022-10-19 17:00  __October  阅读(59)  评论(0)    收藏  举报