AGC 做题合集 #1

  如果之后文章中并没有代码链接,可以通过 https://gitee.com/yinjinrun/code-public-2/tree/master/Atcoder/problems 查看代码。

  因为使用的笔记软件略微特殊,因此导出的 markdown 可能大概只能以脚注形式展示了。

  目前做题顺序:乱序

  1. "AGC041C Domino Quality"[1]
  2. "AGC041D Problem Scores"[2]
  3. "AGC041E Balancing Network"[3]
  4. "AGC038C LCMs"[4]
  5. "AGC038D Unique Path"[5]
  6. "AGC052C Nondivisible Prefix Sums"[6]
  7. "AGC036E ABC String"[7]
  8. "AGC002F Leftmost Ball"[8]
  9. "AGC037C Numbers on a Circle"[9]
  10. "AGC007C Pushing Balls"[10]

  1. AGC041C Domino Quality

    • 你有一个 \(n\times n\) 的棋盘。
    • 你需要在棋盘上放若干个 \(1 \times 2\) 或者 \(2 \times 1\) 的多米诺骨牌。
    • 若放置完毕后,每一行和每一列的多米诺骨牌数量相同则合法。(注意,如果一个 \(1 \times 2\) 的多米诺骨牌放在了某一行上,只算它出现一次。列同理。)
    • 请你给出一个合法的方案。若不存在则输出 -1
    • \(n \le 1000\)

    写死个人。

    因为是自己想出来的,于是写的比较麻烦,大体思路是通过 \(n \bmod 6\) 分类,然后我们发现:

    • 对于 \(n \bmod 3 = 0\) 的,可以通过若干 \(3\times3\) 的拼起来。
    • 然后对于其他情况,分析多米诺骨牌的性质可以发现,每行每列数量必须是 \(3\) 的倍数(这也是我根据 \(6\) 分类的原因之一)。
    • 然后我们可以构造出 \(6\times 6\) 的并且每行每列出现次数为 \(3\) 的方阵。
    • 接着我们可以构造出每行每列出现次数为 \(3\)\(7 \times 7\)\(4 \times 4\)\(5 \times 5\)\(8 \times 8\)(两个 \(4\times 4\))。
    • 然后就除了 \(n = 1, 2\),其他都可以拼出来了。

    具体构造看代码吧(直接输出可以获得更加直观的展示)。 ↩︎

  2. AGC041D Problem Scores

    求长为 \(n\) 的序列 \(\{A_i\}\) 满足的个数:

    • \(1 \le A_i \le n\)
    • \(A_i \le A_{i + 1}\)
    • 对于任意一个子集 \(S, |S| = k\),以及任意一个 \(T, |T| = k+ 1, k \le n - 1\),都满足 \(S\) 中间所有元素的和严格小于 \(T\) 中间元素的和。

    \(n \le 5000\)

    好题,甘拜下风。

    \(K = n / 2\),通过一些手玩可以发现一个 \(\{A_i\}\) 的合法条件是前 \(K+1\) 个元素之和 \(>\)\(K\) 个元素之和。

    然后就跑偏了方向,一直在考虑一位一位地生成 \(\{A_i\}\) 这个序列……然后限制比较多,于是怎么干都是 \(\mathcal O(n^3)\) 的背包。

    其实可以这么考虑 \(A_i\) 单调不降这个条件,一定是每次找一个 \(p\),然后将 \(A_1 \sim A_p\)\(-1\),我们可以预处理出 \(\{w_i\}\) 表示如果 \(p = i\),(前 \(K+1\) 个元素的和 - 后 \(K\) 个元素的和)变化的值(显然 \(>0\))。

    于是问题变成了,你有 \(n\) 个物品,每个物品数量无限,重量为 \(w_i\),求选出若干物品使其重量 \(\le n - 1\) 的方案数。

    完全背包即可。

    启示

    • 对于一个单调的序列进行 DP,不仅仅可以直接记录上一个数的位置,还能够考虑每次对于一个前缀进行 \(-1\),有点类似于 [SDOI2010]代码拍卖会
    ↩︎
  3. AGC041E Balancing Network

    平衡网络是一个由 \(M\) 个平衡器所连接的 \(N\) 根导线所构成的抽象网络系统。这一系统按由左至右的顺序运行。导线从上到下按 \(1\)\(N\) 编号,平衡器从左到右按 \(1\)\(M\) 编号。第 \(i\) 个平衡器连接着导线 \(x_i\)\(y_i\)。下图是一个平衡网络的示例:

    1

    每个平衡器都一定处于以下两种状态之一:向上或向下。

    让我们考虑一个令牌,这个令牌在所有平衡器左侧的某个点开始沿某根导线向右移动。在此过程中,每个平衡器都会被令牌恰好途经一次。当令牌途经一个平衡器 \(i\) 时,可能会发生以下情况:

    • 如果令牌沿导线 \(x_i\) 移动且平衡器 \(i\) 处于向下的状态,则令牌会向下移至 \(y_i\) 并继续向右移动。
    • 如果令牌沿导线 \(y_i\) 移动且平衡器 \(i\) 处于向上的状态,则令牌会向上移至 \(x_i\) 并继续向右移动。
    • 否则,令牌不会改变其移动的导线。

    我们将所有平衡器的状态用长度为 \(M\) 的字符串表示。

    如果存在一根导线 \(w\) ,使得令牌无论从整个网络的哪一根导线开始移动都能抵达导线 \(w\) 且一直沿此导线移动至趋向无穷远的位置,那么这个网络称之为均匀状态;任何的其他状态称之为非均匀状态。

    给出一个整数 \(T (1 \le T \le 2)\) ,请您根据 \(T\) 的值回答以下问题:

    • \(T=1\),则通过自行规定平衡器的方向以构造给出网络的任何均匀状态,或是回答不存在。
    • \(T=2\),则通过自行规定平衡器的方向以构造给出网络的任何非均匀状态,或是回答不存在。

    请注意,若您仅正确回答了一种问题,则您将获得一定的部分分。

    \(n \le 5\times10^4, m \le 10^5\)

    小清新,反正我想不到。T = 1 的想着生成树,然后死活过不了。

    开始是从设每个点能到的位置入手的,这个是比较宏观且正确的,但是后面就想着取具体构造了(建了树),完全没有分析此时的性质……

    对于 T=1,我们正着考虑,设 \(go_x\) 表示能够到达 \(x\) 的点,然后对于一条边 \(x, y\),我们发现可以让 \(go_x = go_y = go_x \cup go_y\),然后并查集维护,最后只要有一个 \(|go_x|=n\) 即可。

    对于 T=2,首先 \(n = 2\) 直接为 \(-1\)。然后我们倒着考虑,设 \(go_x\) 表示 \(x\) 未来会到的点,\(cnt_x\) 表示未来会到 \(x\) 的点,然后对于 \(x, y\),如果其中一个的 \(cnt_{go_x}\) = n - 1,那么就是不好的,让一个大的一个元素到小的即可。否则任意操作,因为 \(\sum cnt_x = n\),于是不可能两个都是 \(n - 1\)(对于 \(n > 2\)),于是完成构造。 ↩︎

  4. AGC038C LCMs

    还是当初学习莫比乌斯看到的神仙题,只看了题面就跑了,今天试着推了一下,然后推出来了!

    题解一大堆,懒得解释了。倒是将 \(10^6\) 看成 \(10^7\) 导致自己虚空卡常了半天。 ↩︎

  5. AGC038D Unique Path

    有一张联通图 \(n\) 个点 \(m\) 条边。

    给定 \(Q\) 条限制,每条限制形如\(A_i,B_i,C_i\)

    \(C_i = 0\),则 \(A_i\)\(B_i\) 仅有一条简单路径。

    否则,若 \(C_i=1\),则 \(A_i\)\(B_i\) 有多条简单路径。

    判定在这 \(Q\) 条限制下能否构造出合法的图。可以输出 Yes,否则输出 No

    数据范围:\(n,Q\le 10^5,m\le \frac{n(n-1)}{2}\)

    注意点的编号从 \(0\) 开始,构造出来的合法的图不允许存在重边和自环,其必须联通。

    这……走偏了,不然完全可以干的。感觉自己做题还是太单线程了,很容易进入一个点然后卡住/kk。

    考虑对于 \(C_i = 0\) 连边(开始直接用边双一类直接连了 \(C_i = 1\) 的),然后会形成一堆树,假设形成了 \(tot\) 个联通块,于是要求:

    • 对于所有 \(C_i = 1\) 的关系,都不能属于一颗树。
    • \(m \ge n - 1\),如果存在 \(C_i = 1\) 的边,要求 \(m \ge n\)
    • \(m \le n - tot + \frac{tot(tot - 1)}{2}\),因为不能在树内连边。

    于是判断一下 \(m\) 的范围即可,要注意的是题目并没有保证 \(m \ge n - 1\)。(这个英文版里面明明是有的啊?!) ↩︎

  6. AGC052C Nondivisible Prefix Sums

    对于所有值在 \([1, p - 1]\) 长度为 \(n\) 的序列,统计 {存在一个方案使得序列重排之后,所有的前缀和不是 \(p\) 倍数的排列} 的个数,对于 \(998244353\) 取模。

    \(n \le 5000, p \le 10^8\),保证 \(p\) 是质数。

    神仙题,猜了半天结论还是没有和正确的结论沾边……

    如何判定

    一个序列合法的充要条件是:设众数为 \(x\),个数为 \(c\),然后将所有数 \(\times x^{-1}\),对于剩下的数 \(y_1, y_2, \dots, y_{n - c}\),一定有 \(c + \sum_{i = 1}^{n - c} y_i < p(n - c+ 1)\),并且总和不为 \(p\) 的倍数。

    必要性:如果 \(c + \sum_{i = 1}^{n - c}y_i \ge p(n - c+1)\),那么因为总和非 \(p\) 倍数,于是有 \(c+\sum_{i = 1}^{n -c} y_i \ge p(n - c+ 1) + 1\),考虑前缀和,就是在数轴上面一步一步地挪动,每次加到 \(kp - 1\) 时,就不能再用 \(1\) 了,必须动用其他的数,最多 \(n - c\) 次,而至少要 \(n - c + 1\) 次,于是寄了。

    充分性:每次选出一个可以放且出现次数最多的数,然后放到后面,可以这样观察情况,发现上面的就已经是卡到了上限了。(感觉在毛估估)

    DP

    首先算出合法的总和非 \(p\) 的倍数的,可以简单考虑前面 \(i - 1\) 个位置的和是否为 \(p\) 的倍数,简单 DP 即可。

    接着减去总和非 \(p\) 的倍数,但是不满足上面的判定条件的,这个时候,可以通过简单的分析得出众数只有一个,假设众数是 \(1\)(最后方案乘上 \(p - 1\) 即可)然后只要 DP 非 \(1\) 的个数,也可以简单 DP + 前缀和(记 \(g(i, j)\) 表示非 \(1\) 的个数为 \(i\),然后 \(\sum (p - i)\)\(j\) 的方案数)优化。复杂度 \(\mathcal O(n^2)\)↩︎

  7. AGC036E ABC String

    给你一个长度为 \(n\) 的仅包含ABC三种字母的字符串 \(s\) ,现在要你输出一个满足下列要求的最长的 \(s\) 的子序列:

    • ABC三种字符的出现次数相同。
    • 子序列中相邻两个字符不能相同。

    如果有多组解,输出任意一组即可。

    数据范围:\(|s|\leq 10^6\)

    考虑删去相邻且相同的字符,然后记 ABC 的出现次数为 \(cnt_a\)\(cnt_b\)\(cnt_c\),然后假设 \(cnt_a \le cnt_b \le cnt_c\)。那么可以把 A 看成分界点,中间夹了一堆 BC 串,可以发现上界是 \(3cnt_a\)

    现在,我们要求删除一些 BC 达到上界,首先我们删到 \(cnt_b = cnt_c\),于是可以先将所有单独的 C 并且可以删除的删掉,如果还是 \(cnt_b < cnt_c\),那么一定是若干 ACACA 这种串,于是只能删 AC / CA 了,可以发现,最后一定可以使得 \(cnt_b = cnt_c\)

    接着考虑让 \(cnt_a = cnt_b = cnt_c\),目前两个 A 中间一定是 BCBC 这种交替的形式出现的,于是可以删除若干可以删的 BC 或者 CB,最后如果还是 \(cnt_a < cnt_b\),剩下的串一定长 ABCABCACBA 这样,也就是两个 A 中间夹的是恰好一个 BC 或者 CB,于是我们只能删一个,于是随便找一个要删的删了,最后使得 \(cnt_a = cnt_b = cnt_c\) 即可,可以发现最后一定满足条件。 ↩︎

  8. AGC002F Leftmost Ball

    给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多少种不同的颜色序列,答案对 \(10^9+7\) 取模。

    $ 1\leq\ N,K\leq 2,000 $。

    感觉这个状态设计得非常巧妙……想不到哇/kk。

    最后的序列一定是开始几个白色,然后变成其他的颜色,这个可以启示我们去考虑第一个空位,可以设出状态 \(f(i, j)\) 表示目前我们有 \(i\) 个白色的球,总共出现的颜色个数为 \(j\) 的方案数,每次我们拿出当前的第一个空位,考虑其染色:

    • 白色,直接 \(f(i - 1, j) \to f(i, j)\)
    • 其他颜色,我们剩下的空位个数为 \(nk - (n - j + 1)(k - 1)- i\),除去该位置,然后从中间选出 \(k - 2\) 个位置,于是有 \(f(i, j - 1) \binom{nk - (n -j + 1)(k - 1) - i + 1}{ k - 2} \to f(i, j)\)

    最后答案是 \(f(n, n)\) 然后就是 \(\mathcal O(n^2)\) 的了。

    启示

    • 对于染色的情况 DP 的时候,有时不需要知道那里有数,那里为空,可以通过巧妙的设计使得我们只要找到一个空位
    ↩︎
  9. AGC037C Numbers on a Circle

    一个环上有 \(N\) 个正整数,一次操作可以把第 \(i\) 个数 \(A_i\) 变为它左边的数、它右边的数和它本身之和,即 \(A_{i-1}+A_i+A_{i+1}\)\(A_0\) 就是 \(A_n\)\(A_{n+1}\)\(A_1\)

    初始时对每一个位置 \(i\),第 \(i\) 个位置上的数为 \(A_i\),目标为对于每一个位置,将这个位置上的数变为 \(B_i\)

    求最少需要几次操作,可以达到目标位置。

    \(n \le 2\times 10^5\)

    想了半天都在想这正着搞😅。

    正着太麻烦了,考虑将 B 变成 A,我们可以发现,最后一次操作的位置 \(i\) 一定满足 \(B_i > \max \{B_{i - 1}, B_{i + 1}\}\),所有满足条件的 \(B_i\) 的顺序都是没有影响的(因为中间有隔断的部分),因此我们可以每次暴力地拿出 \(B_i\) 最大的,然后逆向操作一次。

    但是太慢了,我们可以发现,如果我们减少了一个 \(B_i\),并且它仍然满足 \(B_i > \max \{B_{i - 1}, B_{i + 1}\}\),那么 \(i - 1, i + 1\) 还是动不了,于是我们可以一步到位,直接把 \(B_i\) 减到和 \(A_i\) 差不多的水平(只要还能减少,就减少),就是 \(\left\lfloor\frac{B_i - A_i}{B_{i - 1} + B_{i + 1}}\right\rfloor\) 次,每次一个数至少会缩水 \(\frac{1}{2}\),于是总复杂度为 \(\mathcal O(n \log V \log n)\)↩︎

  10. AGC007C Pushing Balls

    在一条直线上有 \(N\) 个球和 \(N+1\) 个洞。记每个球与相邻的洞的距离为 \(d_i \left( 1 \leq i \leq 2 \times N \right)\)\(d_{i + 1} - d_i = x\)

    要将 N 个球均推入洞中。当球滚过洞时,如果洞中还没有球,球将掉入洞中。否则,球将继续滚动。

    每次会随机选择任一未进洞的球,并随机选择一个方向推球。

    给定 \(N, d_1, x\) ,求出在不发生碰撞的情况下,每个球移动距离的期望(误差小于 \(10^{-9}\)

    \(n \le 2\times 10^5\)

    神仙题,只能说这个等差数列构造得比较巧妙。

    我们考虑令数组 \(a_i = d + ix, 0 \le i \le 2n-1\),其中,对于所有 \(i = 2k - 2, k \in \mathbb{Z}\)\(a_i\) 表示球 \(i\) 与洞 \(i\) 的距离,对于 \(i = 2k - 1\)\(a_i\) 表示球 \(i\) 与洞 \(i + 1\) 的距离。

    而每次推球,就会使得这个数列 \(a_i\) 进行合并(使得 \(a_i\) 仍然可以表示上面的球与剩下的洞之间的距离的定义)!特别地,如果我们删除 \(a_i\),那么一定唯一对应了一种推球方案,而这会使 \(a_{i - 1} = a_{i - 1} + a_i + a_{i + 1}\),同时,导致 \(\forall k \ge i + 1, a_k = a_{k + 2}\)。因此我们考虑一次操作后 \(a_i\) 的变化,总共有 \(2n\) 种选择,有:

    • 如果推球删除的是第 \(x < i\) 段,那么 \(a'_i = a_{i + 2}\),这种情况共有 \(i\) 种。
    • 如果删除的是第 \(i\) 段,那么 \(a'_i = a_{i} + a_{i+1} + a_{i + 2}\),这种情况共 \(1\) 种。
    • 其余不变。

    因此期望值为 \(a'_{i} = \frac{ia_{i + 2} + a_i + a_{i + 1}+a_{i + 2} + (2n - i - 1)a_i}{2n} = \frac{(2n + 2)a_i+(2i+3)x}{2n}\),于是有 \(a'_i - a'_{i - 1} = \frac{(2n+4)x}{2n} = \frac{n + 2}{n}x\),我们惊喜地发现 \(x' = \frac{n +2}{2}x\) 还是一个定值!因此,期望下还是一个等差数列。

    于是这个问题转化为求 \(\{a'_i\}\) 的期望移动距离下的子问题。我们只要求出当前操作期望移动距离即可。

    因为每个 \(a_i\) 可以被等概率选中,期望就是 \(\frac{\sum a_i}{2n} = \frac{a_0 + a_{2n - 1}}{2}\),即计算平均值。

    代码↩︎

posted @ 2022-05-13 09:16  Werner_Yin  阅读(138)  评论(1编辑  收藏  举报