关于此题的一个小想法
查看原帖
关于此题的一个小想法
40078
Effulgent楼主2024/10/2 23:49

考虑boruvka算法。我们需要进行O(nlog⁡2n)O(n\log_2n)次询问某个连通块内的某个点到其他连通块内的点的最小边权。

考虑如下做法:设当前点为xx,我们需要知道min⁡(ax+ay+∣bx−by∣)=ax+min⁡(ay+∣bx−by∣)\min(a_x+a_y+|b_x-b_y|)=a_x+\min(a_y+|b_x-b_y|)。考虑分bx>byb_x>b_y,bx≤byb_x\leq b_y讨论。假设bx>byb_x>b_y(bx≤byb_x\leq b_y)类似。我们要求ax+min⁡(ay+bx−by)=ax+bx+min⁡(ay−by)a_x+\min(a_y+b_x-b_y)=a_x+b_x+\min(a_y-b_y)(x,yx,y对应区间相交)。考虑给每个点ii染色cic_i(cic_i是整数)。相同/不同连通块的颜色是相同/不同的。

考虑对li,ril_i,r_i扫描线。(因为不扫描线要4个log)。在我们插入某个区间时,这个区间会对其他不和它在同一个连通块内的区间产生贡献。而这个区间的最小出边也会被所更新。可以用如下数据结构维护:这个结构支持每次对于一个点xx,查询满足bx>by,cx≠cyb_x>b_y,c_x\neq c_y(把cx≠cyc_x\neq c_y拆成cx>cyc_x>c_y或者cx≤cyc_x\leq c_y,就变成了二维平面的查询)的点yy的ay−bya_y-b_y的最小值,或者给定一个点yy,将满足bx>by,cx≠cyb_x>b_y,c_x\neq c_y(cx>cyc_x>c_y或者cx≤cyc_x\leq c_y)的点xx对ay−bya_y-b_y取最小值。可以用嵌套线段树维护(要先删除再插入,否则不相交的区间会互相产生贡献)。时间复杂度是3个log。

不知道能不能过

2024/10/2 23:49
加载中...