2024.10.16总结


A:

打表发现有决策单调性,考虑人类智慧,每次向后跳 rand%200rand\%200 个点,若更优则继续跳,然后就过了。

正解是这样写的:

p[ip[i] 为当前层的最优决策点,把决策按顺序加入,同时更新 p[i]p[i] 把相同的 p[i]p[i] 合并成一个点,对这些点维护栈,每加入一个决策 kk 就弹出一些栈顶并加入 p[i]=kp[i]=k 的点,区间长度可以二分 O(logn)\mathcal O(log n) 求出比较两个决策的优劣可以用二分 O(logn)\mathcal O(log n) 比较。

B:

黑白染色非常典,酱紫拆点没想到,回头得去看看类似的 trick。

首先正常黑白染色,然后对同色的点按行的奇偶再次红蓝染色,这样就可以把所有点分成四类。

考虑将一个点拆成 x,x1,x2x,x_1,x_2 三个点,其中 xx 连接 S/TS/Tx1,x2x_1,x_2 分别连接相邻的红/蓝点。

画个图:

(其中 A、D 与 B、C 相邻,A、D 为白点,B、C 为黑点,A、B 为红点,C、D 为蓝点)

先假设 A=BA=B ,我们只考虑每个点以自己为中心产生的贡献,若该点度数为 kk ,则其贡献为 A×k×(k1)/2A\times k\times (k-1)/2

列出来就是 0,1,3,60,1,3,6,使用费用递增模型,向 S/TS/T 连四条边:(1,0)(1,A)(1,2A),(1,3A)(1,0)(1,A)(1,2A),(1,3A)

不用上面的拆点,可以得到 52pts,现在继续考虑 ABA\neq B 的情况。

我们按照上边的染色方法染色后,发现对于一个点,它上下的点同色,左右的点同色,且上下与左右的点异色。

这样的图:

也就是说当 xxx1/x2x_1/x_2 之间的边流量流完时,说明产生了一条直线,这这时贡献就需要加上 BAB-A

还是费用递增模型,我们从 xxx1,x2x_1,x_2 连两条边:(1,0)(1,BA)(1,0)(1,B-A),这样就可以计算直线的贡献了。

时间复杂度 O(n2m2)\mathcal O(n^2m^2)

C:

同样是按编号分块,考虑维护好每一块的答案。

考虑拆分,dis(a,b)=dis(1,a)+dis(1,b)2×dis(1,lca(a,b))dis(a,b)=dis(1,a)+dis(1,b)-2\times dis(1,lca(a,b)),只需维护好最后一个部分即可。

对于每一块,在树上 dfs 一遍,计算出 s[i]=s[i]= 块内所有点到 1 的路径中,第 ii 条边被覆盖的总次数。

同时对每个块维护 ans[i]=ans[i]=ii 到这个块中所有点的距离之和修改变为对每个块的 ansans 进行子树加,查询变为对每个块单点查询 ans[x]ans[x]

对每个块维护一个树状数组即可,时间复杂度 O(nnlogn)\mathcal O(n\sqrt n\log n)