曼哈顿距离最小生成树
codechef Dragonstone
首先,对于每一个点来说有用的边只有它向它通过 x=0,y=0,y=x,y=-x 切出来的八个平面的最近点。
证明 我不会
反正当结论记住就行了
然后我们就只需要考虑右上这个区间的点(因为看起来最好做)
其他的区间可以通过坐标变换到这个区间,并且因为边是双向的,可以只考虑y=-x切出来的右上的这四个区间。
对于一个点B(x1,y1)和这里的点A(x0,y0)B是合法的当且仅当x1>x0,y1>y0,x1−x0≤y1−y0
再推一下,发现y1>y0这个条件然并卵,因为第三个条件和第一个条件已经限制了它
所以我们可以看成这两个式子x1>x0,x1−y1≤x0−y0
同时,需要满足x1+y1尽量小
把x1+y1当成权值加入线段树,位置在x1−y1就好了
差需要离散化
别忘多组。。wa了好多次。。
cpp
1 |
|