2023CCPC秦皇岛 游记(VP)

省流

前期不顺罚时太多,不幸掉入铜中。发挥好或许真的可以打出银尾甚至更高。

9.26

内含剧透,请vp后再来。

不是题解!!!!!!!

赛前

要补的太难了,花了好多时间,当时发生什么真忘了。

赛时

开局跟榜很快看到 G,题目要求从一个矩形从左上角走到右下角,给出两个数组分别对应每一行和每一列,单元格 \((i,j)\) 上写的是 \(a_i+b_j\),每次花费是移动的两单元格上数值之间的差的绝对值。我很快给出所有的差都要加一次的结论,但是我模拟的时候忘记要取绝对值了,一直模拟不对,但简听了之后自己模拟很快模拟对了,直接交给叶神上机,我和简跟榜看 A。\(10min\) 时叶神很快一发码过。
A 题要求在一个 \(n * n\) 的矩阵中填 \(k\) 个数字,\(k \ge 2 * n\),要求每行每列均有不少于两个数,且第 \(i\) 行上的所有数的 \(gcd\) 等于第 \(i\) 列的 \(gcd\)。我感觉尽量要让主对角线是一个比较好的数,方便行列的公约数变成 \(1\)。按照这个思路,很快得到了主对角线上放奇数,主对角线右边一格放这个数 \(+1\),剩下的数随便放就行。给简和叶神讲了之后得到肯定,于是让叶神上机去码,我去看了 J 题,让简再检查一下。过了一会简指出第 \(2 * n\) 个必须放在左下角,非常正确的补充,我认为没错就让叶神这样写了。
然后简和我一起看 J,给了 \(13\) 个值,要求每次选其中一些值,让这些值的和不超过 \(m\)。我看到这个数据范围直接提出是状压 dp ,简不置可否自己在看,我就说等下我上机去码,直接继续跟榜看 D 去了。
D 题给了总共 \(n\) 个价格和 \(m\) \((n,m \leq2e5)\) 个优惠券,第 \(i\) 张优惠券在前 \(a_i\) 个价格中可以用一次,会减少这个价格 \(b_i\),新价格可以为负。问买其中 \(k\) 个最少要花多少钱。
简过了一会和我说 J 可以贪心,先取大的然后无脑往下遍历能拿什么拿什么,尽管和数据范围很不符合,但我思考了一下发现非常对就说等一下你去写,此时时间大约就 \(30min\) 左右,我们此时三题出正解非常领先,但很快传来一个不太好的消息。A 挂了。
我把脑袋去看叶神写的啥,没想到他竟然开了一个 \({1e5}^2\) 的数组!我简单指点了一下 c++ 里的 \(map\),扭头继续看 D。
简说了一种贪心,就是第一天直接把优惠券把全部的能用的都假装用了,取此时最小的。剩下的天数就当作没优惠券。这个做法肯定假,但我不是特别会告诉队友哪假了,只能举例子,但例子又老出问题,花了几分钟终于举了一个对的,把他的做法 \(hack\) 了。我就想着怎么重复把优惠券的影响给实时的改变,发现可以用线段树。一开始把所有优惠券都花给全部能用的,然后选取其中最小的,然后这个价格用过的优惠券之前减小的别的价格再加回去。这样的话每张优惠券之后开头区间花费一次,在途中区间加回去一次,时间复杂度就变成了 \(log\) 级别的,我给简讲了之后得到了认可,我们就决定等他写完 J 我再去码 D。
这个时候已经 \(50min\),叶神终于砍下了 A,总共吃了三发罚时,好在他还有时间训练他的 c++,这点无可厚非。简去码 J 题,我给叶讲了一下下一题 F。F 题是给了一个 \(1e5\) 的序列,要求 \(i\)\(i+1\) 的和是质数,每次可以改变任意一个数为任意值,至少要改变多少次能满足条件。我的想法是先假设如果我们改了一个数,这个数可以同时和前一个和后一个都是质数,那么从前往后遍历遇到不符合的就改后面那个数贪心就是对的。叶神模拟了一下样例发现不对,所以有可能一个数不能同时满足前一个和后一个符合条件。这个时候简很快在 \(64min\) 码完了 J,我就上机去码 D 的线段树。
上机码线段树,一开始写的是很普通的我的标准的线段树,后来发现为了减去优惠券需要记录当前最小值的位置,只好加了一个 \(build\) 的函数一开始把每个点的实际的位置都标注一下。另一个是码的途中按照题意应该是先减少 \(b_i\) 再增加,一开始写反了,调了一会。再加上叶神的主机暂时和我不是特别灵魂绑定,虽然现在逐渐熟练了,但还是有些不顺手。在 \(115min\) 时一发入魂通过了 D。
我下机之后叶神和我说了他们的发现,就是当前一个和后一个均不为 \(1\) 且相减后为奇数时,不可能中间那个数使两个数都符合条件。然后他们认为可以通过修改 \(i\)\(i + 1\),然后变得 \(i + 1\)\(i + 2\) 都符合条件,然后直接接着去判断 \(i + 2\)\(i + 3\) 就行。当然遇到 \(1\) 特判一下。他们似乎比较有信心,我也就没有再介入,然后我去看了 M 题,叶神去码了 F,不知道简接下来去干什么了。
M 题是给了一颗 \(5000\) 个节点的树,每次操作选择其中一个 \(i\),构建一个新点 \(i + n\),然后新点和所有和 \(i\) 相连的点连边,如果我这个某个与 \(i\) 相连的点 \(j\) 也有新点,那么连接这两个新点,然后删掉 \(j + n\)\(i\) 的边。问每次操作后都有多少棵生成树。我研究了一会,基本只能知道和破掉环有关,没什么好的思路。
很快他们两个挂了三发 F,我就回来继续看,重新听了他们的思路开始想。这个时候我想到在这个模型里只有四种情况,\(1\),任意奇数,任意偶数和不变,那么我 dp 就可以了。我简单和叶神说了我的想法,叶似乎没太搞懂,我就上机。此时大概 \(180min\) 左右,我们三人的状态大概是简在看后面的题看看有没有榜歪,叶在思索他的贪心,我占着机子但脑子也不太清楚 dp 的具体方式以及要不要留下一部分他们的贪心之类的,于是我先下机。此时叶神和我说他有想法试一下,我也没问就让他试了,他试完之后又挂一发,此时我大概理清楚了,给他们重新讲了一下他们错的地方和我的 dp,就是四种情况间的不同转移,然后上机。叶神的机子有代码自动补全,这道题又有非常多的 \(if\),我贪图方便用了很多代码补全,结果最后就是去查很多小细节 \(bug\),不过最后好歹是成功一发过了,此时 \(231min\),铜牌已稳银牌要开新题。
这个时候大家都比较没有状态,简在不知道看什么后面的题目,也没什么进度。我提出可以跟榜看下一题 M,但大家都挺累了,所以这场就这么结束了。

赛后

赛后看榜,我们五题罚时 \(615\),处在铜中。F 题不论,如果 A 题没吃那些罚时,以及没有占用后面的机时,我们应该很有机会拿下 \(500-\) 的银尾。不过好在只是 VP,没有什么很坏的后果。
赛后首先看到了的是 J 题,这道题确实是出题人出假了。官方题解给的就是我的状压 dp,但也没什么影响,就算是没有问题这个难度的 dp 也对榜应该没什么太大影响。倒不如说简非常值得表扬,面对这么诡异的复杂度敢大胆去贪,为队伍省下了宝贵的时间。
然后是和上一题相反的 D 题,我是写了一个线段树,而官方题解则是一个贪心。对于一个优惠券,按照天数从小到大去遍历,然后用到这些天里面价格最小的那个。这个优惠券如果被用一定是用到当前这种情况下最小的价格,最后再把所有优惠后的价格排序依次取走就行。
接下来就到了补题时间,看官方题解说 I 比 M 简单,是榜歪了,然后我看到 cf 上确实 I 过的只比 M 少一点就去补了 I。I 题是两个操作,一个是把当前序列中最大的那个减少 \(k\)\(t\) 次,另一个是求当前第 \(t\) 大值,\(k\) 是定值,序列长度是 \(5e5\),操作数同样。我很快想到可以把他分成每 \(k\) 个一组,如果当前这组够减完就直接把整组往下挪。但是我并不知道该怎么实现,看了题解发现是线段树合并。线段树合并首先是不能使用标记永久化,然后每次合并就是把不同的两个树上的相同位置的节点丢到合并的函数里,然后一直递归到叶子节点,把 \(sum\)\(tag\) 都根据需要的方式塞进去,再像普通的线段树一样传回来就行。还有把线段树的较大的 \(t\) 个值转移到下一个线段树,而其他值还留在原线段树上。就是先判断这个当前节点的右子树与 \(t\) 的大小,如果小于就直接递归进右子树,否则把这个右子树和需要转移到的线段树的右子树合并,然后把这个右子树赋为 \(0\),然后递归左子树,操作次数是 \(t-t[t[p].r].sum\)
这个题还学到了卡常技巧,使用 \(fread\) 的快读会比普通的快读快得多。不过这种东西还是常数太大了,希望实战我别被卡常,以及逐渐优化我的代码常数吧。还有就是 \(map\) 真的慢。
做完这题一看榜才发现正式参赛队只过了 \(14\) 个,算上打星队也就 \(18\) 个,是正经的金牌题,当然我觉得有榜歪的原因,这我觉得也就银牌难度。不过也许也可以看出我确实是在数据结构方面的理解也许有点偏科,包括这个线段树合并,主席树,以及把贪心用线段树碾过去这种,其他方面我也需要继续努力。
然后接着补 M 题,看了一眼题解就发现这题确实出的挺好的。这个题实际的操作相当于把操作的点涂黑,然后涂黑的点的连通块通过周围相连的没涂黑的点连接到新点构成的相对应涂黑点的树上,想要变成一颗树就要把这个连通块上边上所有没涂黑点连过去的两条边都给干掉一条,然后留下一条连过去就行,这样两边的这个对应的连通块都本身是树,中间只有一条边联通过去。因额外新点和涂黑的点完全等价,所以只用在原来的树上 dp 这个连通块用多少种剩一条特别边的方式就行了。确实是好题。代码中需要注意的就是每个连通块只能在这个连通块的根上和 \(ans\) 相乘一次,不可以乘多。

2025年9月29日

posted @ 2025-09-29 21:29  vivid_stareium  阅读(7)  评论(0)    收藏  举报