AGC 做题合集 #2

  书接上回

  所有代码到 这里 看。

  1. "AGC051D C4"[1]
  2. "AGC026D Histogram Coloring"[2]
  3. "AGC013D Piling Up"[3]
  4. "AGC027D Modulo Matrix"[4]
  5. "AGC051C Flipper"[5]
  6. "AGC056D Subset Sum Game"[6]
  7. "AGC031D A Sequence of Permutations"[7]
  8. "AGC040D Balance Beam"[8]
  9. "AGC040C Neither AB nor BA"[9]
  10. "AGC006E Rotate 3x3"[10]

  1. AGC051D C4

    给出一个四元环, \(S-V-U-T\),你要求有多少条路径满足以 \(S\) 为起点和终点,然后每条边的经过次数满足如下图的限制,模 \(998244353\)

    \(a, b, c, d \le 5\times 10^5\)


    四个变量不是很好考虑,但是如果我们每两步两步地考虑,那么就每次只可能在 \(S\) 或者 \(U\) 开始出发了。

    有三种路径选择方式:

    1. \(S-T-U, U-T-S\),不经过 \(V\)
    2. \(S-V-U, U-V-S\),不经过 \(T\)
    3. \(S-T-S, S-V-S, U-T-U, U-V-U\),原路返回。

    枚举第一种走了 \(i\) 步和第二种走了 \(j\) 步,首先 \(i + j \bmod 2 = 0\),不然不可能返回。

    \(P(a_1, a_2, \dots, a_k)\) 表示有 \(\sum a_i\) 个元素,第 \(i\) 种元素有 \(a_i\) 个,进行可重排列的方案数。

    只考虑 \(i, j\) 的放置,就是 \(P(i, j)\) 种,然后考虑 \(S-T-S, S-V-S\) 型路径,加入当前的路径中的方案数就是 \(P(\frac{i + j}{2}, \frac{a - i}{2}, \frac{d - j}{2})\),因为这种路径随便什么时候,只要返回了 \(S\) 即可执行。

    考虑 \(U-T-U, U-V-U\) 的路径,加入的方案数是 \(P(\frac{i + j}{2} - 1, \frac{b - i}{2}, \frac{c-j}{2})\),因为最后一条回归的路径只能放在最后,而其他回归的路径任意放置。

    最后化简可以得到:

    \[\begin{aligned} &\sum_{i, j} P(i, j) P(\frac{i + j}{2}, \frac{a - i}{2}, \frac{d - j}{2})P(\frac{i + j}{2} - 1, \frac{b - i}{2},\frac{c-j}{2})\\ =& (\frac{a+d}{2})! (\frac{b+c}{2} - 1)! \sum_{i, j} \frac{(i + j)!}{(\frac{i + j}{2})!(\frac{i + j}{2} - 1)!} \frac{1}{i!(\frac{a - i}{2})!(\frac{b - i}{2})!} \frac{1}{j!(\frac{c - j}{2})!(\frac{d - j}{2})!} \end{aligned} \]

    直接 \(\rm NTT\) 即可。 ↩︎

  2. AGC026D Histogram Coloring

    给定一个柱状网格图,第 \(i\) 列的高度为 \(h_i\),你要将每一个格子染上红蓝两种眼色,要求每个 \(2\times 2\) 的格子都恰好有两个红色和两个蓝色,求染色方案数。

    \(n \le 100, h_i \le 10^9\)


    不难发现一个结论,对于一个矩形,我们一行一行地考虑,如果第 \(i\) 行是红蓝相间的,那么就有两种方案(全部反色或者保持不变),其他情况就只有一种方案(全部反色)。

    然后就走歪了,一直想着怎么列一个 DP 状态,然后从各种角度开始考虑(从上到下,从下到上,从左到右),然后都不是很会,或者时间复杂度爆炸。

    正解应该是考虑每个柱状图的最小的位置,我们先染这一个小矩形的方案,然后就会将矩形变成几个独立的部分,然后依次解决即可,也就建立笛卡尔树,然后在笛卡尔树上面 DP。

    考虑当前最小值为 \(h\),然后有 \(w\) 列的高度就是 \(h\),我们设 \(f(c, 0)\) 表示对于 \(c\) 这个图案,最底下一列红蓝相间的方案数,\(f(c, 1)\) 表示所有方案数,对于当前形状 \(T\),我们将最下面的 \(h\) 行砍掉后会产生 \(T_1, T_2, \dots, T_k\) 这样独立的新图案,有:

    • 如果我们将 \(T\) 最底下染色为红蓝相间,那么之后每一行都有两种方案,于是有 \(2^h\) 种方案,并且有一个唯一的限制,上面的每个子图案都必须满足最底下红蓝相间的(同时注意到无论是否反色都是可以和下面对得上的),于是 \(f(T, 0) = 2^h \prod_i f(T_i, 0)\)
    • 考虑所有染色方案,如果我们先染完子图案的方案,然后考虑所有进行反色地继承下来(我们注意到无论上面染成什么样子,都是合法的),同时我们还要给 \(w\) 个已经不在的列安排最顶上的颜色,就有 \(f(T, 1) \gets f(T, 1) + 2^w \prod_{i} (f(T_i, 0) + f(T_i, 1))\),后面是 \(f(T_i, 0) + f(T_i, 1)\) 的原因是对于最低下红蓝相间的图案,你既可以反色继承,也可以直接不反色继承,他们的方案是 \(2\) 种的,而其他是 \(1\) 种,于是要加上。
    • 我们考虑再加上红蓝相间的图案的方式,之前已经算了一些,但是红蓝相间的图案的继承是可以反色也可以不反色的,我们把反色与否看做一个 \(h\)\(2\) 进制数,那么有 \(2^h\) 种,但是我们之前算的是全部反色继承和第一次不反色之后一直反色继承的,于是要 \(-2\),有 \(f(T, 1) \gets f(T, 1) + (2^h - 2) \prod_{i} f(T_i, 0)\)

    因为 \(n \le 100\),于是笛卡尔树可以暴力建。

    启示

    • 这种最大最小比较麻烦的题目最好建一下笛卡尔树!
    ↩︎
  3. AGC013D Piling Up

    一开始有 \(n\) 个颜色为黑白的球,但不知道黑白色分别有多少, \(m\) 次操作,每次先拿出一个球,再放入黑白球各一个,再拿出一个球,最后拿出的球按顺序排列会形成一个颜色序列,求颜色序列有多少种。答案对 \(10^9+7\) 取模。

    \(n,m\) 小于等于 \(3000\)


    以前写过的题,现在补一发简要题解。

    考虑直接 DP,记 \(f(i, x)\) 表示到了第 \(i\) 次操作,目前白球剩余 \(x\) 个的方案数,然后每次枚举情况简单转移即可。

    但是我们发现,如果操作合法,但是初始的白球个数不同,就会算重,接着发现,如果我们把算重的情况用折线画出来,就发现我们只要保留触及 \(x\) 轴的折线即可!于是再开一维状态表示是否触及底部 \(x\) 轴即可。 ↩︎

  4. AGC027D Modulo Matrix

    • 构造一个 \(N \times N\) 的矩阵,要求:

      • 所有元素互不相同。
      • 满足 \(a_{i,j}\leq 10^{15}\)
      • 对于任意两个相邻的数字 ,\(\max(x,y)\bmod \min(x,y)\) 都相等,且均为正整数。
    • 可以证明方案一定存在。

    • \(N \le 500\)


    为什么没有想到染色呢???

    考虑黑白染色,然后给每条 \(i + j = t\)\(i - j = t\) 的线赋上一个质数,每个黑色格子的数就是两条线的乘积,然后白色格子的数就是周围的 \(\rm lcm\),理论数的上界为 \(10^{16}\),但是比较松,于是没事。 ↩︎

  5. AGC051C Flipper

    你有一个无限大的网格,每个网格有 \(0,1\) 两种数字,每次可以选择 \(x,y\) 并对 \((x,y),(x,y+1),(x,y+2),(x+1,y),(x+1,y+1),(x+1,y+2)\) 格子上的数进行翻转,求经过若干次翻转后可以得到的网格中最小可能的数字和。

    \(1\) 的个数 \(\le 10^5\)


    \(a_{x, y}\) 表示第 \(x\) 行,第 \(y\) 列的权值,有:

    • \(p_i = \oplus_{x} a_{x, i}\),每次操作 \(p_i\) 不变。
    • \(q_{x, i} = \oplus_{y \bmod 3 = i} a_{x, y}\),那么每次操作对于所有 \(i\)\(q_{x, i}\) 同时变化。

    只要这两个条件,就可以判定两个局面是否可以互相到达了。证明略。

    考虑使得黑色个数尽可能地少,令 \(a_i = \sum_{x} q_{x, i}\)\(b_i = \sum_{x} p_x[x \bmod 3 = i]\),我们最后的安排必须满足 \(a_i \equiv b_i \pmod 2\)在此前提下,我们可以任意翻转一个 \(1 \times 3\) 的格子。(只要满足高亮的条件,就一定可以通过调整得到翻转 \(2 \times 3\) 的方案)

    然后我们发现,\(b_i\) 已经确定了,我们每次操作,都是改变 \(a_i\),如果 \(a_i\) 已经确定了,那么我们的代价就是 \(\sum_{i = 0}^2 \max \{a_i, b_i\}\),首先这个一定是下界,然后我们可以构造出达到这个下界的解:我们只要放置一个 \(1\) 即可使得两个全部 \(-1\),如果一个为 \(0\),那么我们一个极远处放置,因为 \(\rm xor\) 相等,于是最后可以把不为 \(0\) 的那个值消除到 \(0\) 并且仍然是满足条件的。

    因为 \(b_i\) 已经确定了,实现时我们让 \(ans = \sum b_i\),然后令 \(a_i \gets a_i - b_i\),之后只要求 \(\sum_{i = 0}^2 \max\{a_i, 0\}\) 即可。因为我们每次是翻转一个 \(1 \times 3\) 的格子,于是我们最开始的时候都把 \(q_x\) 代表的一个 \(3\) 位二进制数通过翻转变成一个位数 \(\le 1\) 的数,之后每次翻转的时候都是一个 \(a_j \gets a_j - 1\),其他的 \(a_i \gets a_i + 1\) 了。一直进行此步操作直到贡献最小即可。

    最后如果没有满足上面高亮的条件,再操作一次即可。 ↩︎

  6. AGC056D Subset Sum Game

    有一个长为 \(n\) 的非负整数序列 \(\{a_i\}\),聪明绝顶的 \(\text{Alice, Bob}\) 在上面博弈取数,若 \(\text {Alice}\) 取的数的和 \(s\) 满足 \(L≤s≤R\)\(\text{Alice}\) 获胜,否则 \(\text{Bob}\) 获胜,判断 \(\text{Alice}\) 是否能获胜。

    \(n \le 5000\)


    \(\text{orz } \text{I}{\color{red}{\text{tst}}},\text{z}{\color{red}{\text{houhuanyi}}}, \text{w} \color{red}{\text{yz}}\)

    原题是 \(n\) 为偶数,但其实奇数比偶数更 easy。

    考虑奇数怎么干,我们让 \(\text{Alice}\) 主动出击,占领一个 \(a_i\),然后将剩下的数排个序,然后两两匹配,如果 \(\text{Bob}\) 选了一个数,那么 \(\text{Alice}\) 就选其匹配,我们令奇位置的数之和为 \(X\),偶位置的数和为 \(Y\),一定有 \(X \le Y\),如果我们满足:

    \[X+a_i \ge L\\ Y+a_i \le R \]

    那么就是 \(\text{Alice}\) 必胜。充分性显然,因为无论怎么选择,都是在 \([L, R]\) 范围内。考虑必要性,如果一个条件不满足,比如 \(Y+a_i > R\),那么 \(\text{Bob}\) 先选择最小的,如果 \(\text{Alice}\) 还是按照既定策略,肯定输了,如果不选择,那么到了 \(\text{Alice}\) 手上的数只会更大,于是有了必要性。


    对于偶数,结论是一样的,删除两个数 \(a_i, a_j\),其中 \(a_i\) 就是 \(\text{Alice}\) 主动出击的数,只不过上面的条件中的 \(L, R\) 不能算上 \(a_j\) 即可。为什么呢?因为 \(a_j\) 必须是 \(\text{Bob}\) 选的,而且作用就是切换先后手,切换先后手之后,\(\text{Alice}\) 继续其策略,如果 \(\text{Bob}\) 新开辟了一个没有匹配的数,那么 \(\text{Alice}\) 跟上,否则 \(\text{Alice}\) 选择一个数开启一个新的匹配。

    必要性和之前的解释差不多。 ↩︎

  7. AGC031D A Sequence of Permutations

    给定两个长为 \(n\) 的排列 \(p,q\),设 \(f(p,q)\) 为使第 \(p_i\) 个数为 \(q_i\) 的排列。已知 \(a_1=p,a_2=q,a_{n+2}=f(a_n,a_{n+1})\),求 \(a_k\)

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


    神仙结论题,根本看不出。以下的置换乘法 \(pq\) 表示 \((pq)_i = q_{p_i}\)

    首先有 \(f(p, q)_{p_i} = q_i\),然后可以写成置换形式:

    \[f(p, q) = \left(\begin{array}{c} p_1 & p_2 & \dots & p_n \\ q_1 & q_2 & \dots & q_n \\ \end{array}\right) \]

    考虑左乘一个 \(p\),那么有:

    \[pf(p, q) = \left(\begin{array}{c} 1 & 2 & \dots & n \\ p_1 & p_2 & \dots & p_n \\ \end{array}\right)\left(\begin{array}{c} p_1 & p_2 & \dots & p_n \\ q_1 & q_2 & \dots & q_n \\ \end{array}\right) = q \]

    于是有 \(pf(p, q) = q\),即 \(p^{-1}p f(p, q) = p^{-1}q\),于是 \(f(p, q) = p^{-1}q\)

    然后可以找规律了(注意 \((pq)^{-1} = q^{-1}p^{-1}\)):

    \[\begin{aligned} a_1 &= p\\ a_2 &= q\\ a_3 &= p^{-1}q\\ a_4 &= q^{-1}p^{-1}q\\ a_5 &= q^{-1}\underline{pq^{-1}p^{-1}q}\\ a_6 &= q^{-1}pqq^{-1} p q^{-1} p^{-1}q = q^{-1}p \underline{p q^{-1} p^{-1}q}\\ \end{aligned} \]

    注意到后面的下划线的部分持续出现,我们令 \(A = pq^{-1}p^{-1}q\),有:

    \[\begin{aligned} a_5 &= q^{-1}A\\ a_6 &= q^{-1}p A\\ a_7 &= A^{-1}q q^{-1}pA = A^{-1}pA\\ a_8 &= A^{-1}p^{-1} q A^{-1}pA = A^{-1}qA\\ \end{aligned} \]

    观察发现,\(a_n = A^{-1}a_{n - 6}A\),于是可以直接快速幂。 ↩︎

  8. AGC040D Balance Beam

    给定 \(n\) 个长度为 \(1\) 的石板,Alice 通过第 \(i\) 个石板时的速度为 \(\frac{1}{A_i}\),Bob 通过第 \(i\) 个石板时的速度为 \(\frac{1}{B_i}\)

    现在他们进行这样的一个游戏:

    • Alice 以任意顺序排列这 \(n\) 个石板,并构成一个大石板,然后他站在这个大石板的最左边往右跑。
    • Bob 在这长度为 \(n\) 的大石板上均匀随机选择一个点(注意不一定是整点)然后从这个点开始往右跑。
    • 注意两者同时出发,如果在途中 Alice 抓到了 Bob (即在 Bob 未到达终点时抓到了他),则称 Alice win,否则说 Bob win。

    问 Alice 如何排列这 \(n\) 个石板,可以使得 Alice win 的概率最大,最大是多少?答案输出一个真分数,即 \(P/Q\) 的性质,特别的,如果 \(P = 0\),则 \(Q=1\)

    保证 \(1\le n\le 10^5,1\le A_i,B_i\le 10^9\)


    不难发现,对于任意一种重排序方式,都会存在一个点 \(p\),满足 \(\text {Bob}\) 从这里出发,恰好被 \(\text{Alice}\) 追上,而我们要尽量最大化 \(p\) 的位置。

    然后打了一个奇怪的解法一阵 WAWAWA,最后发现正解巧妙多了。

    考虑构建一个位移-时间的图像,如果 \(\text {Bob}\)\(\text{Alice}\) 的图像有交点,那么表示 \(\text{Alice}\) 能追上 \(\text {Bob}\),而 \(\text {Bob}\) 选择任意一个点出发的本质就是将他从 \((0, 0)\) 出发的图像往下移动若干长度。于是我们将 \(\text {Bob}\) 的图像向下移动直到和 \(\text{Alice}\) 的交点只有一个点,那么该图像和 \(x\) 轴的交点就是 \(p\)

    注意上面的只有一个点中的点一定是一个整点,因为一定是 \(\text {Bob}\)\(\text{Alice}\) 相交了之后,\(\text {Bob}\) 的时间越来越小,如果不是整点,那么斜率没有变化,一定还有一个交点。

    接着考虑从 \((p, 0)\) 出发,沿着 \(\text {Bob}\) 的路线出发,直到和 \(\text{Alice}\) 相交,然后沿着 \(\text{Alice}\) 的路线走到 \((n, A)\),其中 \(A = \sum a_i\)

    我们假设 \(p\) 是一个整点,这里能走到的条件是考虑后面的每个元素的最大斜率为 \(\max\{a_i, b_i\}\),也就是 \(b_p + \sum_{k} \max\{a_i, b_i\} \ge A\),具体构造是将所有 \(b_i > a_i\) 的点放前面,其他的堆到后面去,通过画图发现一定有交点。

    但是后面的每个元素还没有确定,根据条件,这些元素就是最大 \(\max\{a_i, b_i\}\) 的一些元素。因此我们可以按照 \(\max\{a_i, b_i\}\) 从大到小排列所有元素,每次枚举 \(p\) 的整数部分,然后选择最短的前缀,放到后面满足 \(b_p + \sum_k \max\{a_i, b_i\} \ge A\),接着可以简单地计算出小数部分。

    具体实现的时候手写了二分,因为前缀如果 \(\ge p\) 那么需要减去 \(p\) 的贡献。 ↩︎

  9. AGC040C Neither AB nor BA

    给出一个大于0的偶数 \(N\)

    请找出长度为 \(N\) ,由 ABC 这三个字母组成且可以由下列规则把其变为空串的字符串 \(s\) 的数量。

    • 不断选择 \(s\) 中任意除 ABBA 外的长度为2的子串并删除。

    答案可能很大,所以请将结果对 \(998244353\) 取模,\(n \le 10^7\)


    没有想到反转/kk。

    考虑反转所有在奇数位置的 AB(\(A \to B, B \to A\)),然后每次操作变成除了 AABB 都能删除,然后一个序列合法的充要条件是 AB 的个数都不能超过 \(\frac{n}{2}\),必要性显然,充分性可以考虑每次找到出现次数最多的元素的一个位置进行操作(一定有这样的位置),之后仍然满足这个条件,直到最后只剩两个元素,肯定可以删除完毕。

    答案计算可以通过全部的 - 不合法的,不合法的部分可以通过枚举出现次数计算。即 \(\displaystyle 3^n - 2\sum_{i = \frac{n}{2} + 1}^{n} \binom{n}{i} 2^{n-i}\)↩︎

  10. AGC006E Rotate 3x3

    我们有一个 \(3\)\(N\) 列的初始矩阵,\((i,j)\) 位置的数为 \(i+3j-3\)

    我们有一个这样的操作:选择一个 \(3\times3\) 的子矩阵,将这个子矩阵旋转 \(180°\)

    现在给出一个 \(3\)\(N\) 列的矩阵(矩阵中的数各不相同),问能否通过若干次上述操作将初始矩阵变为给定的矩阵。

    \(N \le 10^5\)


    差一小点就猜对了结论!

    首先,我们发现一次翻转操作不会对每一列的数的组成有任何改变,最多颠倒顺序。

    于是可以转化为有一个排列 \(\{a_i\}\),每次可以对于一个 \(a, b, c\),交换 \(ac\),并且令 \(a, b, c\) 的状态反转。问最后能否回到 \(1 \sim n\) 的排列并且所有状态都是 \(0\)

    注意到每次操作总有一些是确定的:

    • 奇数位置和偶数位置的数永远不会混一起。
    • 整个序列的状态 \(\rm xor\) 和与奇数偶数分别考虑的逆序对奇偶性相同。

    然后就 Wa 了 \(12\) 个点……

    我们注意到下面的条件不是很完美,每次操作会会改变 奇数 / 偶数 位置的逆序对奇偶性,同时改变 偶数 / 奇数 位置的状态 \(\rm xor\) 和。

    于是这个条件应该写作:

    • 奇数位置的逆序对奇偶性 和 偶数位置状态的 \(\rm xor\) 和不变;

    • 偶数位置的逆序对奇偶性 和 奇数位置状态的 \(\rm xor\) 和不变。

    于是就做完了。 ↩︎

posted @ 2022-05-30 08:52  Werner_Yin  阅读(183)  评论(1编辑  收藏  举报