「Log」2023.11.21 小记
序幕
\(\text{6:40}\):到校,直接就开始改题了,忘写博客了。
发现点分治每次都是找重心出问题,写三次忘记给 \(stot\) 赋值三次。
\(\color{blueviolet}{P4149}\)
点分治板子,稍微维护一下一个长度路径至少需要几条边即可。
间幕 \(1\)
\(\text{7:05}\):写一下博客。
写完接着做题,看半天题没思路发现是动态点分治,原来找错题了。
找了道神仙题做做,自己思考未果,看题解看了大半个小时才看懂,开打!
打的很慢,打了两个多小时,样例没过,发现桶贡献计算错了,改完过样例,然后一遍过了,开心。
\(\color{black}{P2664}\)
静态点分治。
考虑颜色对端点的贡献,首先特殊化根的答案以及贡献,这部分是简单的,然后考虑子树内节点的答案以及贡献。
设 \(f_x\) 表示节点 \(x\) 的贡献,对于一个节点 \(x\),若其祖先节点中没有和其同色的,有 \(f_x = siz_x\),否则 \(f_x = 0\)。
对于某点 \(x\),考虑一条 \(x\) 到 \(y\) 的路径,将其分为 \(x \to \mathrm{root}\) 以及 \(\mathrm{root} \to y\) 两部分分别考虑贡献。
对于前者,考虑此部分的每个颜色,都会在 \(y\) 取到不同的点的时候造成一次贡献,所以每个颜色会产生 \(siz_{\mathrm{root}} - siz_{\mathrm{branch}}\) 的贡献,其中 \(\mathrm{branch}\) 表示 \(x\) 所在的子树。
对于后者,考虑每个节点都会造成一次贡献,所以有贡献 \(\sum \limits _ {y \notin \mathrm{branch}} f_y\)。
考虑两部分贡献可能多算,因为颜色可能有重复,也就是说统计 \(\mathrm{root} \to y\) 部分贡献时只能累加不在 \(x \to \mathrm{root}\) 路径上的颜色的贡献,我们选择额外减去其贡献。
对于一个点 \(x\),一次计算中有其答案(设 \(x \to \mathrm{root}\) 路径上的颜色集合为 \(C\)):
其中 \(\sum \limits _ {y \notin \mathrm{branch}} f_y = \sum \limits_{i \in T_{\mathrm{root}}} f_i - \sum \limits_{i \in mathrm{branch}} f_i\),然后写巨大多 DFS 就可以解决了。
间幕 \(2\)
中午吃了汉堡,然后和同学下楼溜达一圈,回来整理一下题目,写博客。
打了一会 4k,困了就睡。
\(\text{14:00} \sim \text{15:00}\):睡觉。
苏醒之后下楼溜达一圈,回来处理点分树。
思考效率疑似过低,看了好一会才看懂,打打打。
写了巨大长,感觉比上午的黑题还难。
细节处理上有点问题,改完之后处理一下空间也就过了。
调的过程中吃了晚饭,一般般。
\(\color{blueviolet}{P6329}\)
动态点分治模板,需要处理的部分很多,细节也一坨。
间幕 \(3\)
找下一道做,一直在看题解但是不懂,最后九点多被提醒认知错掉了,理解方式换一下马上就没问题了。
然后开始疯狂码题,然后就 WA 了。
然后发现细节处理有问题,贡献计算的时候缺了点东西,改完就过了。
\(\color{blueviolet}{P3345}\)
动态点分治,首先考虑在点分树上移动找最优点,然后动态点分治计算贡献即可。
尾声
计划了一下明天要做什么就睡了,晚安。