2024-11-25总结

游戏人生

考虑到当 \(k=3\) 时,跑得最慢。

考虑怎么优化,因为当你处理到 \(B=N^{\frac{1}{k+1}}\) 的质数时,后面只可能是 \(k\) 个数相乘,所以我们处理到这里之后直接判断能不能刚好开 \(k\) 次根就好了。

例如当 \(k=3\) 时直接处理到 \(32771\) 的质数之后直接判断能不能开三次根就好了。

注意,开根用 qpow(x,1.0/k) 时不要忘了 1.0

逆序对

我们只会操作 \((x,y)\)\(a_x\ge a_y\)

发现操作的左端点只能是前缀最大值,否则扩大之后不会变劣,右端点也只能是后缀最大值。

正难则反,考虑一个数怎么产生贡献:

\(x<y<z\) 时,对于 \(a_x>a_y>a_z\)\(y\) 对于操作 \((x,z)\) 区间会产生 \(2\) 的贡献。

直接扫描线维护即可。

如果有相同的数(这题没有,但 バブルソート (Bubble Sort) - 洛谷 | 计算机科学教育新生态 这个有),那么当 \(a_y=a_x\) 时 或 \(a_y=a_z\) 时只会产生 \(1\) 的贡献,如果都相等,就只会产生 \(0\) 的贡献。

那么我们只需要建两个矩形,一个是左端点包括相等右端点不包括,\(1\) 的贡献,一个是左端点不包括右端点包括,\(1\) 的贡献,那么如果都不相等刚好为 \(2\) 的贡献,之和一个相等刚好为 \(1\) 的贡献。都相等刚好为 \(0\) 的贡献。

图论考试

大家都用了克鲁斯卡尔,但我用了 Prim。

就是考虑模拟 Prim 的过程,然后她不是每次将距离点集最近的点找出来吗,就是用线段树维护 dis,每次操作就是找出最小的数 x,然后将每个数更新为 \(\min(a_i,a_x)\),注意这里可能有一些和 \(x\) 连过边的不能被更新,可以直接先在更新前暴力询问她们的值,然后更新完后再暴力还原回去就可以了。

然后我们需要将 \(x\) 的值赋值为 \(\infty\)

步行

听说是很经典的结论,但是我不会/wul。

先考虑答案怎么计算: \[ \sum d_i+d_{i+1}-d_{lca} \] 然后前面的因为 \(v_i\) 都相等,所以贡献是一样的,那么我们是不是要让她的 \(d_{lca}\) 尽可能小。

\(lca\) 为根时,她最小。

那什么时候 lca 为根,当 \(i\)\(i+1\) 不在一个子树内时!

\(lca\) 为(带权)重心时,它的每一个子树大小都小于等于 \(sum/2\),那么就可以满足上述条件!

考虑添加修改,我们先钦定 \(a\)\(b\) 的 fa,\(c\)\(b\) 的孙子,\(d\) 不是 \(b\) 的孙子:

如果 \(D\)\(C\) 的lca不是原本的重心 \(rt\) 时,显然它们即使断边连边后也在一个子树内,重心不变。

否则我们新的重心一定在原本的重心到 \(D\) 的链上,直接从 \(D\) 倍增网上跳求重心,也就是要求 \(sz_u+sz_B<=sum/2\)

考虑求完重心怎么求每个点到她的距离。

显然先可以用换根求出没有修改前每个点到她的距离。

修改后只有 \(B\) 子树内的距离会改变。

先把错误的距离删去,也就是删除 \(B\) 子树内到 \(u\) 的距离(没有修改的)

然后添加正确的距离,也就是添加 \(B\) 子树内到 \(u\) 的距离(修改后的)

注意到前面这个很好求,但后面这个我们遇到了挫折。

可以用容斥,先求出每个点到 \(C\) 的距离(没有修改的),然后删去B外面到C的距离(没有修改的),就可以得到B内到达C 的距离。

前面都是好求的,所以都很好求。

然后做完了,\(O(n\log n)\)

本文作者:ZnPdCo

本文链接: https://znpdco.github.io/blog/2024/11/26/2024-11-25%E6%80%BB%E7%BB%93/

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论