CF2151 Codeforces Round 1053 (Div. 2) 游记
省流
这是连续第三场掉分,1800 变成 1500,2t 轻巧的结束这场比赛,请大家继续期待我的表现。
9.24
内含剧透,请vp后再来。
不是题解!!!!!!!
赛前
今天的 cf 提前到了晚上 7:30 开始,那么非常好的让我不用在寝室里窝着。在前一天晚上 vp 完 abc 和早上 vp 了 cf 之后信心满满,觉得今天肯定可以拿下了,毕竟已经到了 1600 这个情况,我虽然一直大幅度波动但也好几个月没下蓝了。于是我怀揣着轻松的心情就开打。
赛时
上来看 A 题,题目按 1,1,2,1,2,3 这样写一直写到出现第一个 n,然后给你一个形如 1,2,1,2,3,1 这样的串,保证这个串在大串里出现过,问出现了几次。不难发现如果这个串是在 1 - k 范围内,没有到下一个 1,2,3,4... 这样的串,那么就是出现了 n - k + 1 次,否则只出现一次。4 分钟很快秒了。
接下来看 B 题,题目给了一些黑格,然后给了一个长度为 n 的操作的序列。序列中的操作有两种,一种是往后走一格,一种是跳到下一个白格。然后有 n 个人,每个人从 1 出发,按顺序开始动,第 i 个人只执行前 i 个操作,然后把所在位置涂黑,然后下一个人再从 1 开始走。一开始以为后一个人可以无缝接上前一个人,然后直接按照只有一个人来模拟,发现不对,进行了一些微调无果,感觉很不对劲。我及时的冷静了一下,感觉是只有最后的几个人会有影响,但不太会证,于是先跳过看 C。
C 题给了 2n 个数,要求将这些这些数两两配对然后连线,但同一点上的线不能超过 k 个,要求所有连线长度之和最长。容易发现我们尽量想要最前和最后的去连肯定效果最好,然后中间的点按顺序从前往后两两配对就行。于是统计一下奇偶的前缀和就解决了,此时 30min,排名还比较靠前,不过此时我并没有发现排名靠前是因为打的人比平时少很多。
扭头看 B,思索了二十分钟左右仍没有确定的答案,于是认为直觉没有问题,只有前面的几个人会影响,于是分别交了往前滚 3 个和滚 10 个人的,都挂了,至此束手无策,但赛后发现这个基本上是正确的。
接下来看 D,此时就有点不冷静了,D 是一个数学要推来推去的题目,此时发现过的人比较少,基本上是我平时极限的一档,而我并不擅长推来推去的题,就跳过了看 E。当然后来发现过的人少的原因是这场打的人少。
E 题给了 n 个物品和两个人,每个物品有一个价值 v,两个人对所有物品都有偏好,他们会先拿当前还有的物品中偏好最大的。问第一个人可能拿的物品的价值之和最大是多少。第一时间想到的是可以用类似拓扑排序的东西去搞,然后思索了一下,发现有点像分组背包一样的东西。就让第二个人一直拿,直到把第一个人当前最偏好的东西拿走,然后第一个人按偏好往后找,在出现下一个还存在的物品之前的物品都必须要先拿前一个物品才行,最后把所有这些分组的取所有最大的前缀和。写完后跑样例发现有些东西不止要先拿前一个,因为这个物品第二个人可能会很早拿,所以前面很多物品都要第一个人拿。于是我把每个物品的前置费用都算出来,然后却发现拿物品可能会重复计算,至此卡住。
接下来的一个多小时,基本上就是在 B 和 E 之间反复横跳,但没什么建树,但秉持着不可以提前逃跑,要养成习惯的想法,坚持到了三个小时才走。
赛后
一出来就没绷住,打算去肯德基抚慰一下自己幼小的心灵,但果然还是太穷根本吃不起,也不希望影响第二天学习,就自己收拾收拾心情下班了。
第二天早上看了 B 的题解,发现就是只有前一个会影响,我重构了我的代码,用 map 实现就过了,不知道一开始用的 set 是哪里出现了一些问题。
然后接着看思考比较多的 E,题解给了一个 dp。把所有物品按照第一个人的偏好排序,然后去看这个物品在第二个人拿了第一个人第 j 爱的物品后谁拿。如果第一个人拿,那么第二个人在前面拿的物品一定要小于当前这个物品的位置,如果第二个人拿,那么找到这个物品在第二个人爱好的序列,并把这个时候的价值转移到第二个人拿了这个物品或 j 中较大的那里。这样是一个 n^2 的 dp,再加上一个线段树就可以搞定了。小于 j 的都可以加上这个物品的价值,或者小于 j 的转移到这个物品的价值,大于 j 的情况不变就行了,就是区间查询最大值和区间加。这道题我码的时候由于中间有多个映射,长时间搞混一些数,以及要注意因为价值有负数所以各种初始化都应该是 -INF 而不是 0。
下午看 D,D 题是给了一个 n * n 的格子,然后要求每一行能填 ai 个黑格,要求对于 1 <= k <= n,所有 k 有且只有一个黑格的 x 和 y 的最大值是 k,一个黑格的 x 和 n - y + 1 的最大值是 k。观察后两个条件,第二个条件相当于总共只能有 n 个格子,第三个条件相当于 n * n 的格子中有一个 v 字型是可以涂黑的格子,就像中心的那个格子是 0,然后一个 y = x^2 的函数围起来的图案,同时每一列至少有一个。这样就可以得出 v 字形中每列能且只能填一个黑色格子。观察到这个性质后,就可以很容易的去从下往上推组合数了。写这道题时一开始快速幂写错了,而且没初始化 inv[0],以及忘记对阶乘取模,浪费了一些时间。
这场比赛打完之后也有一些好处,一个是我可以劝自己 rating 不重要,重要的是每天学习的量,第二个是今天我可以打 div3 了,虽然说 rating 不重要,但这次应该总能上分了吧……?
2025年9月25日