CF2133 Codeforces Round 1044 (Div. 2) 游记(VP)
省流
前三题太慢,第四题比较快,打出表现分两千,终于回到原来的水平了。
9.23
内含剧透,请vp后再来。
不是题解!!!!!!!
赛前
昨天晚上打了一把成功的 abc 信心比较足,早上早起到图书馆写完 abc 的游记就开一把 cf,下午有线代,上完之后应该会写一些位运算的题单,晚上再打 cf 实战,今天这场在心态上还是有帮助的。
赛时
第一题给了 n 个齿轮,每个齿轮有 ai 个齿,要求第一个齿轮和最后一个齿轮的转速相同。注意到每个在右边的齿轮会除以 ai,在左边是乘 ai,所以中间的都不重要,只要头尾齿数相同就行了。统计时一开始忘记初始化,5min 才过这道题。
B 题是有 n 个人,每个人都有一个值 x,连接两个人会使花费增加 max(x1, x2),然后这两个人的 x 都减小 min(x1, x2),求最小让所有人连起来的花费。显然最小花费肯定是要连成一颗树,而且每个点都至少有一条边。那么最大的那个值肯定要被花费,既然他被花费了,就可以把另一个减成 0,这里另一个肯定选择次大的,于是就是每次取最大的两个出来并增加较大的那个花费即可。我一开始误以为较大的那个后面还要连,实际上再连直接连较小的那个也就是 0 就可以了,所以根本不用管。16min 通过。
C 题是交互题,给了一个节点不超过 500 的有向无环图,每次选一个起点和一些点,会返回这个起点在这些点中的最长路径是多长,要求在 2 * n 次询问中得到一条整个图中的最长路径。这题我一开始被卡了一会,以为真的是自己水平下降严重直奔绿名了,于是规定自己 40min 不出思路就开下一题,不过在 35min 左右就有了想法。一开始我想的是从最小的 1 往前去找,但这样可能重复。后来发现我只要找到所有点中在整个图上最长的,然后把他作为起点去遍历所有他的长度减 1 的点,如果可以连起来那么这个点就作为下一个点一直找到底就可以了。通过此题时 53min,表现分只有绿,已经有点慌张了。
接下来开 D 题,题目给了一个高度不超过 2e5 的竖着的楼,每层楼都有一个血量 x,每次攻击能造成一点伤害,当一层楼血量变成零时他上面的楼层会作为一个整体塌下来,他上面的一层楼会收到他的高度的摔落伤害,如果这层楼直接摔死了那这层楼的上面一层楼会接着受到一点摔落伤害,以此类推,问所有楼都死了最少攻击多少次。发现一层楼要死了只有两种方式,砍死或者摔死。如果砍死,那么这层楼上面的一层楼会受摔落伤害,如果摔死那上面的楼会受一点伤害,那么我们就可以考虑是直接不动上面的楼让他受摔落伤害还是把上面的楼砍成一滴血,再连锁反应摔死他。这样就可以构成一个从上往下的 dp,因为上面的楼砍成一滴血或死之后对下面的楼是没有影响的。76min 通过此题,不过这个题解写的确实太烂,只能说 dp 果然还是很靠感觉。
E 题给了我们一棵树,树上有一个人,有两种操作,第一是检查一个点,然后这个人会跑到自己位置相邻的一个除了刚刚检查的点,第二是把一个点的边炸了,要求输出一个不超过 5n/4 的操作顺序一定能抓到这个人。一种一定能抓到这个人的想法是先把所有点都炸了再都检查一遍,这样是 2n 的,然后考虑可以少炸哪些点也可以全部检查一遍后抓住这个人。发现如果是一条链,那么从一端检查到另一端一定可以抓住,那么题目就变成了让我们炸掉一些边,让这棵树变成一堆链。直接炸 3 条边的点肯定会超,但我只有大约 40min 左右,只好先猜一个做法。我把所有点按边数排序,然后按边数从高到低依次去炸,直到没有三条边的点。写完之后交上去发现和本地输出不一样,后来发现是 -s.size() 的表现与预期中的 s.size() 的相反数不同,稍微改了一下样例过了,但交上去挂掉,且没几分钟时间了,比赛结束。
赛后
赛后去看 E 的题解,题解把树分为三种点,黑/黄/绿。其中黑色点是有大于等于三个绿点或大于等于一个黄点是子节点,黄点只有两个绿点是子节点,剩下的是绿点。这样的话删掉黑点后剩下的点都是链了,而黑点如果有三个绿点,那么黑点是 1/4,如果是一个黄点,黄点下面还有两个绿点,黑点还是 1/4,所以删黑点的操作不会超过 1/4,再加上 O(n) 的遍历链就可以通过了。不过需要注意的是有两点在代码中错了,第一是 set 中删除不存在的值评测机会爆 re,第二是后序遍历中要注意其实子节点的 vis 也是已经访问过的。
2025年9月24日

浙公网安备 33010602011771号