Competition Set - AtCoder II
这里记录的是这个账号的比赛情况。
ABC310
2023-7-15
Solved:6/8
1973->2053
七场ABC,两场打得蛮烂的,都因为AT炸掉Unrated了;另外五场全部满Perf(2400)。
后面没有Rated的ABC了。这个小号本来就是拿来干这个的,结果一下就没了。考虑一下强行下分?
E(Easy,1261)
定义运算 \(*\) 为: \(0*0=1,0*1=1,1*0=1,1*1=0\)。给定一个01序列,求它的所有子序列从左到右 \(*\) 的结果之和。
Solution:考虑递推,如果第 \(i\) 位是 \(0\),那么以它结尾的所有序列结果和为 \(i-1\);如果是 \(1\),则是 \(i\) 减去前一位的结果。
F(Easy+,1938)
已知 \(x_1,...,x_n\) 分别在 \([1,a_1],...,[1,a_n]\) 中等概率取整数值,求集合 \(\{ x_1,...,x_n\}\) 有一个子集和为 \(10\) 的概率。
Solution:状压DP。设当前考虑到第 \(i\) 位,记录当前是否可以得到 \(0,1,...,10\)。选择大于 \(10\) 的转移统一考虑。
G(Medium,2696)
\(n\) 个人,第 \(i\) 个人每回合把手上所有的球给第 \(a_i\) 个人。\(x\) 在 \(1,...,k\) 中等概率取,问 \(x\) 回合后每个人手上球数的期望。
Solution:显然构成内向树森林。找到环,对每个点,考虑 \(k\) 回合后能不能到环上。如果不能,那么在树上打差分标记;如果能,在环上打差分标记。求和即可。代码不好写,没调出来。
ABC305
2023-6-10
Solved:7/8
1855->1973
G(Easy+,1989)
给定若干长度不超过6的ab串,求有多少个长为n的ab串不以其中任何一个为子串。
Solution:矩阵乘法。没了。
ABC304
2023-6-3
Solved:6/8
Unrated
ABC303
2023-5-27
Solved:6/8
1655->1855
F(Medium,2381)
有一个血量为\(h\)的boss,有若干种攻击,一种攻击会持续若干回合,每回合造成相同的定量伤害。问至少要多少回合才能干掉boss。
Solution:二分答案,口算何时最优。记得用__int128。没了。
ABC302
2023-5-20
Solved:8/8
1200->1655
G(Medium,1891)
给定一个长度为\(n\),只包含\(1,2,3,4\)的数列。每次可以交换任意两个数。求将数列从小到大排序的最小交换次数。
Solution:贪心。将每个位置的初始值与其目标值构成的数对记录下来,总共12种(相同的不用记)。先处理\(cnt_{i,j}\)和\(cnt_{j,i}\),即取它们的\(\min\),加入答案,然后两个值都减去\(\min\)。再类似的处理三元和四元的情况,分别用\(\min\)的两倍和三倍更新答案。
H(Medium,2407)
给定一棵树,每个点上有一个数对。对每个\(v \le 2\),考虑从点\(1\)到点\(v\)的路径,在路径上每个数对中选出一个数,求能够选出不同数字个数的最大值。
Solution:先考虑确定的\(v\)如何求解。一个方法是建图,在每个数对的两个数之间连边。对每个连通块,如果是树,则贡献为点数\(-1\),否则贡献为点数。
因为只用考虑连通块,所以可以用并查集维护。记录下每个并查集内部是否有边即可。
对于原题,以\(1\)为根遍历这棵树,每进入一个点时在它的数对间连边,然后更新答案。回溯时撤销操作,这只需要用一个按秩合并的并查集实现即可。
ABC300
2023-4-29
Solved:7/8
0->1200
F(Medium-,1846)
给定由o和x组成的字符串\(S\)。将\(S\)复制\(m\)遍,然后将其中\(k\)个x改成o,求改完之后连续的o最多可能有多少个。
Solution:贪心。设最多能改完\(t\)个完整的\(S\),考虑三类情况:
-
最长连续o段包含了\(t\)个完整的\(S\)
-
最长连续o段包含了\(t-1\)个完整的\(S\)
-
最长连续o段不包含完整的\(S\)
三种情况都可以预处理前缀和,后缀和,然后用双指针处理。注意判断\(m\)能否使上述情况出现。
G(Medium-,2343)
求不超过\(n\)的数中所有质因子都不超过\(k\)的数的个数。\(k \le 100\)。
Solution:双向搜索。将小于\(k\)的(不超过25个)素数分成两组。先dfs第一组素数能拼出的所有数,记录在一个vector里。然后dfs第二组素数能拼出的所有数,在第一个vector中二分查找即可。
ABC299
2023-4-22
Solved:6/8
Unrated
F(Hard-,2366)
给定字符串 \(S\),求字符串 \(T\) 的数目,使字符串 \(TT\) 是 \(S\) 的字串。
Solution:首先可以想到要尽可能向左边取,才可以使 \(T\) 不重复。
枚举中间的分界点,然后 \(DP\):\(dp_{i,j}\) 表示两个 \(T\) 的结尾分别是 \(i,j\)。转移方程很好写。
这道题的难点在于状态定义。
G(Medium,2088)
给定一个数组,值域为 \(\{1,2,...,m\}\),求它的一个子序列,其是 \(1,2,...,m\) 的一个排列,且字典序最小。
Solution:重复两个步骤:
-
找到尽可能短的一段后缀,包含需要的所有数。
-
在上一个选的数到这段后缀的开头之间找到最小数,加入答案序列。
第二步可以直接暴力,能过但能卡。