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:重复两个步骤:

  • 找到尽可能短的一段后缀,包含需要的所有数。

  • 在上一个选的数到这段后缀的开头之间找到最小数,加入答案序列。

第二步可以直接暴力,能过但能卡。

posted @ 2023-04-30 11:02  by_chance  阅读(40)  评论(0编辑  收藏  举报