atcoder(2022.7~2022.11)
AGC 001 D
题目大意:有一个长度为 的序列 ,它的和为 ,需要将 重排,并构造一个任意长度但和为 的序列 ,使得对任意长度为 的字符串,如果它能被 划分成一堆长度为 的回文串,且能被 划分成一堆长度为 的回文串,那么它的所有字符一定相同。
转化为图论问题,相当于是要使 个点的图连通。
如果 的奇数个数大于 无解。
把长度为偶数的 放中间,长度为奇数的 放两边。
端点处的 伸出一个接口。
中间的 伸出两个接口。
AGC 001 E
考虑组合意义。
相当于是求从 走到 的方案数。
考虑平移一下,求从 到 的方案数。
然后设 表示走到坐标 的方案数。
刚开始把所有 对应的 加 ,最后还要减去 到 的贡献再除以 即可。
AGC 001 F
没见过的套路。
考虑 表示元素 在原排列 中出现的位置。
那么原来的条件可以转化为,当 且 时可以交换 和 。
因此,当 时,如果 ,无论怎么调整,总有 。
也就是说,当 时,如果 ,无论怎么调整,总有 。
因此,可以根据初始时 的大小关系建立 ,使得字典序最小。
暴力拓扑排序的话可以把点放到一个小根堆里,每次取出编号最小的删除。
可以考虑使用线段树优化这一过程,一个点 入度为 仅当它在 中值最小。
每次从小根堆中取出元素后把这个点删去,再分别查询 和 中最小的点,检验一下是否入度为 即可。
AGC 002 D
题目大意:有一张连通图,第 条边的边权为 ,每次询问给定 询问从 和 走出来的点集满足大小等于 时最大边的最小值是多少。
方法一:
可以离线,因此可以直接使用整体二分,答案用可撤销的按秩合并并查集维护,可以做到 。
方法二:
可以考虑建出 重构树,每次询问二分一个答案,倍增往上跳,维护子树内的最大点权,时间复杂度 。
AGC 002 E
用画图法解决博弈论。
考虑把 从大到小排序。
然后把数列 看成一个阶梯状的网格。
操作 相当于删除最左的一列网格。
操作 相当于删除最下的一行网格。
因此可以看成在网格上移动。
网格突出的地方满足 ,为必败点。
于是可以 求出网格上所有点的状态。
直接 是 ,无法通过本题。
观察一下状态的取值可以发现,一条斜线上的 值相等。
因此可以从 出发,找到 所在斜线在网格内的最远点。
考察一下那个点与初始必败点间的位置关系即可。
AGC 002 F
终于懂了。
考虑一种颜色一种颜色地加,那么任意时刻白点的个数都大于等于颜色的种类数。
考虑给其它颜色编号,编号为 的颜色对应第 个白点,即编号为 的颜色一定是从左到右第 种出现的颜色。
这样,在我们加颜色的过程中,相当于是在给颜色编号,可以做到不重不漏。
设 表示加入了 个白点, 种颜色的方案数。
AGC 003 D
首先,只需要考虑 的质因子,一个数如果含有 的质因子,它肯定可以选。
其次,每个数分解质因数后的指数都可以模 。
每个数都这样处理,会得到一个新的数列,满足新的数列中的数有唯一对应的不能同时选入集合中的值,这个值可能和它不等,可能和它相等。不等的话取个 ,相等的话只能选一个。
这样做的复杂度是 ,其中 在 左右,无法通过本题。
考虑把分解所用的质因子调少,只考虑 的质因子。
假设分解过后还剩的数为 。
如果 ,那么没有影响,正常处理。
如果 ,那么只可能是 ,, 这 种情况,其中 和 都是质数。
如果是 ,那么它要匹配的数需要乘上 。
如果是 ,那么它要匹配的数需要乘上 。
如果是 ,那么它要匹配的数需要乘上 。
因此,判断一下 是不是完全平方数分类讨论一下即可,时间复杂度为 。
这道题提示我们根号分治不一定只是二次根号,还可能是多次根号。
AGC 030 D
一般的题目都是通过方案数求得概率,这道题说明还可用概率求方案数。
观察到每次交换只会影响 个点对间的概率,但被影响方案数的点对较多,因此可以从概率的角度入手。
设 表示 的概率,每次转移为 ,因此总复杂度为 。
AGC 041 D
第三个限制较难,先考虑第三个限制。
对于一个大小为 的子集 和一个大小为 的子集 ,需要满足第三个限制,相当于使得 集合的最大值小于 集合的最小值。
于是贪心地构造,排序后把前 个数放到 集合,后 个数放到 集合,那么第三个限制等价于前 个数的和大于后 个数的和。
再考虑第一个限制,这相当于每次选择一段前缀减 。
于是可以预处理出每段前缀减 后对前 个数和后 个数的差的影响,跑一个完全背包即可。
ARC 104 D(背包DP,平均数)
题意
有 种数 到 ,每种数可以选择 到 个。
需要对每个 ,求出选择一些数,和的平均数为 的方案数,对 取模。
,。
题解
发现平均数不好处理。
假设选出的集合为 ,那么需要满足 。
把每个 减去 得 。
这相当于是从 到 中选一些数,从 到 中选一些数,使它们的和相等的方案数。
设 表示前 种数和为 的方案数。
使用多重背包的前缀和优化可以做到 。
ARC 104 E(搜索,DP)
题意
有 个数,每个数的范围为 到 ,求所有填数方式中最长上升子序列的长度和。
对 取模。
题解
很小,于是可以先搜出所有可能的相对大小关系。
对于一种确定的相对大小关系,考虑 DP。
将所有的上界从小到大排序后可以发现,每种数一定只会出现在某两个相邻的上界之间。
设 考虑了前 种上界,放了前 种数的方案数。
转移考虑新的上界之间放几个数,判断一下合不合法即可。
ARC 105 D(博弈论,结论)
题意
有 个背包, 个盘子,背包 里有 个硬币,初始时盘子里没有硬币。
两个人轮流操作,如果还有背包有硬币,那么可以选择一个背包,把全部硬币导入某个盘子中,如果没有背包有硬币,那么可以选择一个盘子,至少取走一个硬币,最后不能操作的人输。
题解
简单题结论题,虽然我还是没有做出来。
首先当背包里的硬币全部转移到盘子上的时候,就是一个简单的 Nim 游戏,如果异或和大于 ,先手必胜,否则后手必胜。
如果 是奇数,Nim 游戏的时候后手先取,由于无论先手怎么放硬币,后手总能使一个盘子的硬币总数大于一半,因此后手必胜。
如果 是偶数,与奇数的情况类似,只是要特判所有数字出现次数都是偶数的情况。
ARC 105 E(博弈论,结论)
题意
有一张 个点 条边的无向图,两个人轮流操作,每次操作后需要满足下面两个条件:
- 节点 和节点 不连通。
- 没有重边和自环。
谁不能操作就输了,问谁能赢。
题解
假设最后 所在连通块的大小为 ,那么能够连的边数为 。
首先,如果 是奇数,那么这个公式的奇偶性固定,可以直接得到答案。
现在考虑 是偶数的情况。
假设 所在的连通块大小为 , 所在的连通块的大小为 。
如果 和 的奇偶性相同,那么除去 和 必然剩余偶数个点。如果 为偶数,无论先手怎么操作,后手总能消除他的影响,因此后手必胜。否则, 为奇数,那么先手必然可以通过一次操作调整奇偶性,然后效仿之前后手的操作即可必胜。
如果 和 的奇偶性不同,那么必然存在一个除去 和 的连通块大小为奇数,因此,先手总可以调整使得这个式子为偶数且 和 的奇偶性相同,转化为上面一种情况可以得出先手必胜。
ARC 105 F(状压DP,容斥)
题意
有一张 个点 条边的简单无向图,问选出一个边集,使得 个点与这些边构成的图连通,并且图是二分图的方案数。
对 取模。
。
题解
注意到连通图这个限制不好处理,于是可以考虑容斥。
设 表示给集合 染色,不保证连通的方案数, 表示给集合 染色,保证连通的方案数, 表示集合 内部的边数。
求解 ,可以考虑用总的方案数减去不连通的方案数,通过枚举 中的一个连通块转移。
为了防止算重,可以钦定 中的任意一个元素 在选择的连通块中。
ARC 106 E(二分,Hall 定理)
题意
你经营着有 个员工的商店,每个员工会工作 天然后休息 天。
每一天你可以选择一个员工给他一枚奖章,问要使得每个员工都有 枚奖章最少需要多少天。
题解
首先,可以二分答案,问题转化为能否在 天内给每个人 个奖章。
这可以抽象成二分图匹配:左边有 个点,右边有 个点,左边的点与右边的点有连边表示能够在那一天给那个人一枚奖章。
现在需要判断这张二分图是否存在最大匹配。
注意到只需要判断是否存在最大匹配,并不需要求出具体的最大匹配是多少,于是可以考虑 Hall 定理:对于任意一个左部点的集合 假设它能连到的右部点的集合为 ,满足 。
有一个结论是,我们并不需要枚举 个集合,只需要枚举 个集合,并钦定集合中一定包含了每个人的那 个点。
这是因为我们只需要找到那些最不可能满足条件的集合就行了,而对于固定的人的集合 , 取得最大值是在每个人都选满 天的时候(天数越大越容易超过 )。
所以,只需要二分答案后枚举 个集合判断即可。
ARC 106 F(计数,prufer序列,生成函数)
题意
有 个点,每个点有 个孔,每次可以选择两个不同点,连接两个未被连接过的孔,有多少中方案使得最后形成一棵树。
题解
考虑 prufer 序列,假设第 个点的度数为 ,那么答案为
考虑生成函数
那么答案为
即
ARC 107 D(背包DP)
题意
选择 个数,每个数只能是 ,使得它们的和为 的方案数。
题解
设 表示考虑了前 个数,和为 的方案数。
分两种情况:
- 选 ,从 转移。
- 不选 ,从 转移。
若 ,。
AGC 030 F(DP)
首先,如果 和 都不是 ,那么可以直接配对。
于是现在只有两个 或一个 的情况。
先不考虑两个 之间的排列顺序,最后乘上一个阶乘即可。
现在问题转化成给一大一小的数配对的方案数。
记 表示 是否在序列中出现。
按照从大到小DP,设 表示考虑了大于等于 的数,有 个 的未匹配的数, 个 的未匹配的数,能够得到的数列个数(不考虑两个 间的相对顺序)。
时间复杂度 。
AGC 013 D(DP)
AGC 036 D(差分约束,负环,DP)
不存在负环等价于差分约束存在一组解。
考虑差分约束的变量 ,因为 向 连的边权为 的边不会删去,因此满足 。
令 ,需要满足 ,再令 为 的前缀和。
如果 向 连了一条边权为 的边,那么 ,即 。
如果 向 连了一条边权为 ,的边,那么 ,即 。
可以发现 的取值只能是 。
现在问题转化为有 个取值为 的变量,如果一个连续段的和大于 会付出一定代价,如果小于 会付出一定代价,求最小代价。
考虑 DP,设 表示最后一个 的位置为 ,倒数第二个值为 ,只考虑右端点小于等于 的连续段的最小代价。
使用二维前缀和优化即可做到 。
AGC 040 E(DP)
将序列分成两个序列相加的形式,令 ,于是答案等于 。
设 表示前 个数, 的最小代价。
可以发现对于同一个 ,一定有 ,而对于同一种取值的 , 肯定越小越好。
于是只需要对每个 ,维护 个 即可,时间复杂度 。
AGC 032 E(结论,调整法,二分答案)
结论是一定存在一个分界点,满足左边首尾匹配后小于 ,右边首尾匹配后大于等于 ,可以通过调整法证明。
于是二分答案即可。
AGC 010 E(拓扑排序)
先考虑 固定的下最终的序列是什么。
如果存在 ,满足 与 不互质,那么 与 的相对顺序已经固定,可以根据这个建出一张 DAG。
而后手要使得字典序最大,用大根堆维护拓扑序即可。
下面考虑先手的策略。
先手要使得字典序尽可能小,于是可以从小到大枚举权值 ,枚举所有与它不互质的数 ,如果 没有访问过,那么 向 ,然后访问 ,递归下去。
对建出的图求一个最大拓扑序即可。
AGC 027 E(结论,贪心,DP)
参考 小粉兔的题解。
首先,有个经典套路,将字符串中的 看成 , 看成 ,那么每次操作后模 意义下的和不会改变。
然后,有一个结论,对于一个固定的字符串 , 能够变成字符 当且仅当 或 存在相邻的两个字符相同且 模 意义下的和与 相等。
根据这个结论,我们可贪心地判断 是否能够变成 。
对于 的每个字符,找到 极短的一段前缀能够替换成那个字符,且必须满足最后 的字符在模 意义下和为 。
先特判掉没有相邻字符相等的情况,然后考虑对这个贪心的过程DP。
设 表示以 开始的后缀能够变成的 的个数,为了方便,转移时可以加入一个空串,最后再减去即可。
时间复杂度 。
AGC 017 F(轮廓线DP)
很妙的轮廓线DP。
先把一条折线用一个 序列表示, 和 分别表示往左还是往右,然后不难想到一个暴力的状压DP,设 表示考虑了前 条折线,其中第 条折线的状态为 的方案数,时间复杂度是 。
考虑轮廓线DP。
设 表示前 条折线,第 行,轮廓线状态为 ,第 行上第 条折线与第 条折线的距离为 的方案数,时间复杂度为 。
考虑继续优化。
可以发现当前状态如果合法,如果这一位没有限制,那么这条折线可以往左走,如果有,那么可以往右走,问题在于没有限制但却往右走的情况很麻烦。
可以考虑设 表示前 条折线,第 行,轮廓线状态为 的方案数。其中 的 到 位表示当前折线的状态,而后面那些位表示限制,如果为 表示可以填 ,如果为 表示只能填 (类似数位DP)。
考虑转移。
-
第 位为 ,只能向右走,。
-
第 位为 ,可以往左也可以往右,如果往左,之后的限制并不会被影响,。
如果往右,会改变之后的限制,因为先在可以不管限制往左一次,也就是说,可以去掉 位之后的第一个 ,令 到 位构成的集合为 , 位以及之后构成的集合为 ,那么 (不严谨,看代码)。
ABC 276 G(组合数学,差分)
题目要求相邻两个数模 不同余,这个限制不好处理,考虑差分。
假设差分后的序列为 ,那么需要满足如下限制:
-
。
-
如果 , 模 只能是 或 。
-
。
假设 ,那么 ,方案数为 。
AGC 012 D(组合数学,结论)
如果 能和 交换,且 能和 交换,那么 的顺序可以任意排列,因此,相对顺序可以改变的性质具有传递性。
于是可以轻易得到一个 的做法,枚举所有点对 ,如果 和 能交换那么就把它们合并到一个连通块,最后的答案就是所有连通块答案的积。
再思考一步可以发现,连边只和每种颜色权值最小的点有关,分类讨论一下即可。
AGC 018 F(欧拉回路,构造)
对于一个节点 ,如果在两个树上儿子个数的奇偶性不同,那么一定无解。
考虑建出一张有 个节点的图,其中 到 号节点表示第一棵树, 到 号节点表示第二棵树,它们均保留原来树上的边,特别的,两个根之间连一条双向边。
此时,对于 ,如果 号点的度数为奇数,那么 和 之间连一条双向边。
这样,所有点的度数都是偶数,存在欧拉回路。
跑一遍欧拉回路,考虑之前新增的边的方向,如果是 向 ,那么 的值为 ,否则为 ,对于没有新增边的点,值为 。
证明可以考虑欧拉回路中每个简单环的贡献。
AGC 035 D(DP,逆推法,搜索)
最后一定会剩下下标为 和 的两个数。
考虑逆推,假设要在 和 中间插入一个数 ,考虑 对答案的贡献。
设 将会被记入答案 次, 将会被记入答案 次,那么 的贡献为 。
于是考虑设 表示当前剩下的两个数的下标为 和 , 将会记入答案 次, 将会记入答案 次的最小和。
转移考虑枚举新加的数的位置
最后的答案为 。
这个算法的复杂度是多少呢?
可以发现,当 相同时运算次数是完全相同的于是有一个大概的式子(不严谨,但可以这么分析):
设 是 的前缀和,那么
于是时间复杂度为 。
AGC 015 D(结论,分类讨论)
令 和 从高到低第一个不同的二进制位为 ,m = (l >> p << p) + (1ll << p)
, 为 以下, 的二进制为 的最高位。
把区间分成两部分: 和 。
- 区间的数能够得到的数为 。
- 区间的数能够得到的数为
[m, (r >> p << p) + (1ll << (q + 1)) - 1]
。 - 最后再考虑两个区间之间的影响,能够的得到的数为
[l | m, m | (m - 1)]
。
AGC 016 F(博弈论,状压DP)
AGC 014 D(博弈论,结论,树)
首先,如果原图存在完美匹配,那么后手获胜。
如果不存在完美匹配,先手每次选择叶子的父亲,那么后手必然选择那个叶子,如果存在一个点,它的儿子是叶子的个数大于 ,那么先手可以获胜。
于是,先手可以每次都选择一个叶子的父亲删除,在它选择之后,后手的选法就确定了。
由于不存在完美匹配,因此到最后一定存在一个点,它的儿子是叶子的个数大于 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】