ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AGC 做题合集 #1

2022-05-13 09:35:07  阅读:154  来源: 互联网

标签:cnt le frac 可以 AGC times 平衡器 合集


如果之后文章中并没有代码链接,可以通过 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\)。

    想了半天都在想这正着搞

    标签:cnt,le,frac,可以,AGC,times,平衡器,合集
    来源: https://www.cnblogs.com/werner-yin/p/16265391.html

    本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
    2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
    3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
    4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
    5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有