CF2149 Codeforces Round 1054 (Div. 3) 游记
1. # 省流
div3 赛时 AK, 赛后惨遭 unordered_map hack 掉,重回 rating 1700。
9.25
内含剧透,请vp后再来。
不是题解!!!!!!!
赛前
没什么值得说的东西,或者我写的太晚已经忘了。
赛时
A B C 都是简单模拟贪心,没什么可提的就跳过吧,三题没吃罚时用时 7min。
D 题给了一个只含有 a 和 b 的序列,要求把这个序列变成 aabbaa 或者 bbaabb 这样的序列,求最少要邻项交换多少次。可以选择要在中间的那个字母,统计出现的位置,然后选取一个位置作为中心点把其他的位置靠过来。发现一步要消耗的是位置相减加这个字母当前出现次数相减,也就是所有点都可以改作位置减第几个,然后取中间值即可。通过时 20min。
然后我接着开了 F 题,F 题是一开始有 h 点生命值,然后每 n 次可以移动 n 步,需要消耗 \((n + 1) * n / 2\) 点生命,也可以选择休息一次并回复一点生命,问最少多少次到 d 位置。一开始手玩了一下样例,发现第一步走最长可以模拟对,码完交上去挂了。然后把 double 的计算改成二分去找仍旧挂,就扭头看 E。
E 题给了一个序列,然后给了 l 和 r,要求找到有多少个子串里恰好有 k 个不同值,且子串长度在 l 和 r 之间。那么维护两个滑动窗口,第一个维护从 i 到 x 恰有 k 个不同值,第二个维护从 i 到 y 恰有 k 个不同值,y 取最大,x 取最小。从 i 到 x 到 y 之间就都是需要的 k 个不同的序列。再注意长度即可。过此题时 43min。
重新看 F,发现走路需要 d 步省不了,只能省休息次数。那么二分答案休息次数,显然当休息次数确定时尽可能平分每一段路就行,很容易通过。通过时 75min。
最后看 G,给了一个数组 n,求询问 l,r 之间有什么出现超过三分之一的数。发现大于三分之一的数随机选一个数很容易选到,所以去随机的选一些点然后检测就行。查看序列中有多少个可以使用二分。交上去后发现不是 T 就是随机开少了 WA,改成 unordered_map 就通过了,然后复制了别人博客里的防 hack 的 hash 交上去,这个时候 114min。
赛后
第二天晚上才重测完,发现惨遭 hack。把哈希的东西改了一下,把随机数调大一点就过了。看来 unorderd_map 我还需要多学,以及随机数常数特别大,算复杂度时需要谨慎。
2025年9月27日