AGC 做题合集 #6
书接上回,代码可以在此处查看,对于 VP 的题目,可以在这里看代码。
- AGC032C Three Circuits[1]
- (VP)AGC025C Interval Game[2]
- (VP 补题)AGC025D Choosing Points[3]
- (VP 补题)AGC025F Addition and Andition[4]
- AGC056C 01 Balanced[5]
- AGC043C Giant Graph[6]
- AGC024F Simple Subsequence Problem[7]
- AGC031C Differ by 1 Bit[8]
- (VP)AGC022C Remainder Game[9]
- (VP 补题) AGC022E Median Replace[10]
AGC032C Three Circuits
- 有一张 个点 条边的简单无向连通图。
- 请你判断能否将边分成三个集合,每个集合都是一个可以多次经过重复点的环。
- 。
给一个萎做法:
考虑直接构建欧拉回路,然后根据欧拉回路剖分出尽可能多的环,如果环数 直接寄了。
当然,欧拉回路会让环数更小,于是这个是萎的,但是我们发现不同的起点和遍历顺序
shuffle
几下,多跑几遍,然后就过了。
考虑正经做法:
-
首先,根据欧拉回路对于度数的要求,只要存在一个点的度数是奇数,那么直接寄了。
-
因为是联通图,如果存在一个点的都市 ,那么直接是 OK 的。
-
接下来只有度数为 的情况:
- 如果全部度数都是 ,就是一个大环了,直接寄了。
- 考虑度数为 的点的个数,如果只有 个,那么就是寄了;如果有 个,手玩可以发现无论如何都是 OK 的;对于两个点,我们可以考虑这个中间是不是连着一堆长长的链,如果是,就寄了;否则就是 OK 的。
AGC025C Interval Game
- 数轴上有 个闭区间,第 个闭区间为 。
- A 和 B 玩游戏,A 初始在原点 ,每次 B 选择一个还未选过的区间,A 要走到任意一个属于该区间的点。最后 A 要回到 。
- A 希望最小化自己走过的路程,B 希望最大化 A 走过的路程,在两者都采取最优策略的情况下,求 A 走过的路程。
- ,。
手玩样例可以发现,每次我们的移动,一定是一次走到左端点最右的区间,接下来一次走到右端点最左的区间……如此往复交替进行(最多开始先后顺序不一样)。
于是可以枚举开始的操作方向,
set
维护即可。 ↩︎AGC025D Choosing Points
给定 , 要求构造一个在 的网格中选出 个点的方案, 使得任意两点间的距离不为 或 .
。
日!又是碰巧猜对了“一个距离就是二分图”的结论,结果卡在“两个点就不是二分图了该怎么办啊啊啊”上面😂不过这个题真的是万分熟悉又耳目一新!一度怀疑如果去年就做了这题,我 NOI 的 Day2 也不会是这个 💩 样子了。
首先,对于一个距离,我们将所有违反限制的点建立一个图,容易发现这个是一个二分图。
给几种证明,第一种就是我 VP 的时候猜的时候给出的证明(超级超级感性理解的猜测),图一乐呵:
首先,如果出现了奇环,比较平凡的情况是三个点构成了一个等边三角形,只要证明不存在这种三角形即可(猜的):
我们可以发现,我们几乎画不出来这种图形,如果画出,一定有一个格点直角三角形满足两个直角边的比例是 ,这是无理数,因此不可能!
一种比较正经的证明:
考虑令 ,其中 ,所有距离为 的点可以表示为 ,其中 。
- 如果 ,不存在解,任意染色。
- 如果 ,那么 一个是奇数,一个是偶数,根据 奇偶染色。
- 如果 ,那么 都是奇数,直接根据 染色即可。
接着我就陷入了两个点是什么图的情况了……
其实可以将两个图分开,两个二分图,需要选出一个点集,满足这个点集在两个二分图上面都是独立集。我们可以在两个二分图上面分别染色,每个点在一个图上面有 中染色情况,两个图上就有 中情况,点数是 的,根据鸽巢原理, 个集合一定存在一个集合满足点数 。 ↩︎
AGC025F Addition and Andition
给定长度为 的二进制数 和长度为 的 对他们进行 次以下操作:
- 令,并将 和 加上 。
求出 次操作后的 和 。
这个题启示了我们要考虑每个 最后会怎么移动。
只有一对 才会移动,于是我们可以考虑维护每一对 的贡献,如果从低位到高位,这个会产生一堆影响,并且高位是不确定的,于是我们要考虑从高位到低位计算答案。
如果这里有一对 ,每次操作,它们都会向前移动一格,如果前面都是 ,这个不要管,如果存在 ,那么可以就会和这个 “撞上”,我们可以计算撞上的贡献,如果还是一对 ,可以继续推进,因此可以直接使用单调栈维护 的位置即可,每次撞上,都会减少 的个数,于是复杂度就是 的。 ↩︎
AGC056C 01 Balanced
构造一个长度为 的 字符串,满足 个条件,第 个条件形如 中 , 个数相同。如有多解,输出字典序最小的。
。
直接差分约束,对于限制,,对于相邻的 即可,然后发现全部是正边,显然有解。
最后根据跑出来的 计算输出答案即可。 ↩︎
AGC043C Giant Graph
给定三个简单无向图 ,其中每个图的点数均为 ,边数分别为 。
现在根据 构造一个新的无向图 。 有 个点,每个点可以表示为 ,对应 中的点 , 中的点 , 中的点 。边集的构造方式如下:
- 若 中存在一条边 ,则对于任意 ,在 中添加边 ;
- 若 中存在一条边 ,则对于任意 ,在 中添加边 ;
- 若 中存在一条边 ,则对于任意 ,在 中添加边 .
对于 中的任意一个点 ,定义其点权为 。
试求 的最大权独立集的大小模 的值。
。
别看是个 C,但是难度到了 *2800,对着这题想了 年后,突然灵机一动就会了!
首先,权值的差异非常大,于是我们可以按照 的顺序选择每个点,如果一个点没有被 ban 掉,我们就直接选择,并且把它在这个 Giant 图上面相邻的点全部 ban 了。
想想这个过程类似于什么,考虑一个博弈游戏。
我们有三堆石头,对应三张图 ,Alice 和 Bob 轮流操作,每个人操作的时候,可以选择 且第 堆石子的个数为 ,然后让第 堆石子的个数变成 个,如果一个人不能操作了,那么就会输。
这个游戏的必输态就是我们最后选择的最大独立集,每次我们按照 选择点,如果一个点没有被 ban 就是必输态,然后把它的后继点全部设为必胜点。
这是 个博弈的游戏的组合问题,我们只要对于每个游戏,每张图求出其 函数,然后我们就要在三张图上面选择 ,满足 ,贡献就是 ,这个可以简单的使用 解决。
PS:写完后瞟了一眼题解才发现傻了,实际上 函数不超过 的,直接枚举即可。 ↩︎
AGC024F Simple Subsequence Problem
有一个
01
串集合 ,其中每个串的长度都不超过 ,你要求出至少是 中 个串的子序列的最长串,如果有多解,输出字典序最小的那组解。由于 可能很大,因此我们是这样描述 的:
- 你将得到 个
01
串,第 个串的长度为 。 - 第 个字符串的第 个字符,代表数字 的、长度为 的二进制表示是否出现在 中。
。
考虑如何判断一个串 是 的子序列,我们可以维护一个位置 ,然后枚举 的每一个位置 ,找到 中 后面第一个和 相同的 ,然后 即可。
于是我们可以记录一个 DP, 表示目前已经进入子序列自动机完成匹配的部分是 ,剩下待匹配串是 的方案数。
每次转移的时候,考虑让什么进入子序列自动机即可,然后将一大段删掉。
因为 的长度都是 级别,我们不能全部记录,于是可以直接记录 合在一起的长度,已经 合在一起的情况,每次枚举 然后转移。 ↩︎
- 你将得到 个
AGC031C Differ by 1 Bit
将 排成一个排列 满足:
- 。
- 。
- 与 在二进制表示下只相差 位。
若无满足条件的 ,输出
NO
。否则第一行输出
YES
,第二行输出任意一个满足条件的序列。。
首先,如果 二进制下 个数是奇数一定有解。
至于构造,可以考虑递归构造,定义 表示问题的解。
首先,我们假设问题是 ,并且 第 位为 。我们可以类似于格雷码,递归构造 和 ,其中 为 去掉第 位的 的结果,将后者集体 即可。
我们找到 的第一个为 的位置(一定存在),然后就是上面问题将答案中的 和 位交换结果,于是正式解决了 。
最后求出 ,将答案 即可,这个就是问题 问题了。 ↩︎
AGC022C Remainder Game
给定一个序列 ,希望通过若干次操作将其变为目标序列 。
一次操作为选择一个正整数 ,同时任意选择一些数 将它们变成原数 除以 的余数(相当于对每一个数任意选择变化或不变化),这次操作的代价为 。
总代价为所有操作代价之和,求最小总代价。
如果无论如何也不能变成 序列,输出
-1
。。
VP 的时候想其他奇奇怪怪的问题去了,导致 年才切……
不会吧,不会吧,有人第一眼想到的是 DP 吧……注意到代价差异比较大,于是直接从大到小贪心,能不选一个 就不选一个 。
如果不选当前的 ,那么我们就将之前的所有选的数和之后所有 的数拿出来, 一下是否合法。
显然,直接建图 BFS 即可。 ↩︎
AGC022E Median Replace
有个奇数长度的 串 其中有若干位置是
?
。每次可将 个连续的字符替换成这三个数的中位数。
求有多少方案将 替换成 使得进行 次操作后的字符串是 。
。
想到了用栈,但是感觉不行于是弃疗选择打表了🤣,自闭了……
考虑如何判定,我们维护一个栈,满足栈底到栈顶是一长段 然后是一长段 构成。
考虑加数:
-
加 :
- 栈顶是 :如果有两个,直接发动技能变成只有 个 ,显然更利于后面的结果,否则直接加;
- 栈顶是 :直接加!
-
加 :
- 栈顶是 : 抵消了,后面这 个数取决于之后的数,于是可以删除栈顶的 ;
- 栈顶是 :如果有两个 ,不加(已经比较优秀了,最后答案一定是 ),否则直接加。
最后只要满足 个数 个数即可。
显然,栈中间的 个数不超过 ,于是通过 DP 记录 个数即可。 ↩︎
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App