2025.3.8随笔&ds练习总结
考试
拿到题后大概扫了一遍三个题,发现 A 是签,于是花 20min 一遍过了。因为这个题是区间加区间赋值,我以前写过两三遍,所以就对自己很有自信。又看到自己出的数据没有错于是后面就再也没管过了。
期望得分:100。实际得分:0。
B 是一个非常显然的图论题,然后我马上想到线段树优化连边,区间连区间然后递归下去一直连到叶子。但是这样区间还是太多了,怎么办呢?我在手玩数据 20min 后想到一些小分讨可以进行一些剪枝,但是再套上线段树就太难写了。然后我又马上换了一个方向,去想了一会根号分治,但是在处理区间长度大于根号的时候我没有更优秀的方法,最后在 9:40 放弃思考,开冲部分分。
期望得分:\([30,50]\)。实际得分:70。
C 看着就比 B 亲切得多,一拿到题我想到了反演,然后刻画出充要条件。我发现对于一个点需要维护子树内和子树外的黑点个数,全局求两者同时非零的个数,于是想到可以维护两者的乘法。但是乘法写起来很麻烦于是稍微转换一下变成全局最小值全局最小值个数(类似扫面积板子),然后考虑每次修改只会对链产生影响,于是可以用 set 维护点集,树剖线段树维护答案。
当时我非常兴奋,但是马上想到这样是 \(O(n\log^2n)\) 的,但是数据范围是 \(n\le2\times10^5\)。我感觉这很极限应该过不了,大概能有 60 到 70 左右。考虑到我把这些写下来可能一共要写 150+ 行,但是看到部分分加性质分(原题严格弱化版)有 60 于是就拼的分。
期望得分:60。实际得分:60。
改题&总结
A 挂分是真的不应该。错误的地方是区间赋值的时候没有清空区间加法标记。可能就这道题我对自己太过于自信,以至于过了一点小数据后就扔掉不管。以后不论是练习还是比赛中我都不能轻敌,所谓“狮子搏兔亦用全力”,省略的每一个步骤都是对自己的不负责任和对题目的不尊重!
改题花了十分钟。
其实赛后在与他人交谈知道其实这些题都不难。hkx C 写法就是我的做法,只不过我认为有风险所以没去实现。然后看题解发现题解就是利用了用 dfs 序建虚树的小性质,然后就直接单 \(\log\) 用 set 随便做了。
改题用的是题解的做法,耗时 15min 左右过掉此题。
但是 B 题并查集是我没有想到的。我发现每次一考图联通之类的题我就会自动忽视并查集,但并查集往往是最高效最简洁的做法。只要我想到可以不用把图真正建出来而是用并查集的归属直接表示。另外一个就是此题用到的倍增思想我在想题时也不常用到、一般都不会往这方面想,可能是这种类型的题做少了没有意识,以后要注意!
改题用了 15min 左右。
总的来说,我在 ds 这方面的提升肯定是有的,但是思维逻辑的缜密还有待提升。我对一些算法思想的忽视有时往往导致自己将问题复杂化,所以在思考的时候尽量去想问题的本质,比如我做这个东西、求这个东西到底是为了什么?

浙公网安备 33010602011771号