Grid With Mirrors 又名“月黑风高,鸭在捉鹅”

( ext{Description})

洋文

中文

(mathtt{kxy}) 又微醺啦!醉鹅从坐标为 ((1,1)) 的酒吧出来,在 (n imes n) 的大街上乱跑!注意(mathtt{kxy}) 初始时是向右跑的!

大街上充满了危险,有 (m) 个位置存在 (mathtt{lt})(别问我为什么 (mathtt{lt}) 多达 (10^5) 个),如果 (mathtt{kxy}) 跑到这种位置就会触发 (mathtt{lt})!醉鹅虽然醉了,但是只聪明鹅,不会跑入这种位置。

鹅跑是因为鸭捉,鸭捉是因为鹅跑。

(mathtt{qbt}) 自觉跑不过醉鹅,心生一计,决定在原地守株待鹅。她会在某些方格放一瓶 "勇闯天涯",当醉鹅到达此方格就会转向(当然我们的 (mathtt{qbt}) 是只聪明鸭,醉鹅转的方向由 (mathtt{qbt}) 决定)。她会在所有的方格实施这个计划,不过经费有限,你需要算出 ( ext{Ans}=sum f(x,y)),其中 (f(x,y))(mathtt{qbt}) 在方格 ((x,y)) 时使 (mathtt{kxy}) 跑入自己怀里的最少 "勇闯天涯" 数。需要注意的是,如果 (mathtt{kxy}) 无论如何跑不到此方格,(f(x,y)=0)

(nle 10^5)

( ext{Solution})

真的啥也不会。

首先这个数据范围就应该意识到不是将空白行/列看成点就是用 (m) 个障碍来做。

这里是用空白行/列(我们定义空白行/列为连续无障碍的区间)。可以计算一下这个的空间复杂度:对于空白行,如果没有障碍就是 (n) 条,发现多一个障碍就会多划分出一个空白行,空白列同理。空间复杂度大约 (n+m)

如何维护 "转向" 的操作?考虑如果有两个相交的空白行和空白列,就在它们之间连一条边权值为 (1)

(dis_u)((1,1)) 所在的空白列到 (u)(这是空白列/行的编号)的最短距离,(r(x,y),c(x,y)) 分别是 ((x,y)) 所在的空白行/列编号。那么有:

[f(x,y)=min{dis_{r(x,y)},dis_{c(x,y)}} ]

如何建图?考虑用扫描线 + 线段树维护每一行对应的空白列,再对于此行的空白行 ((l,r)),将它与线段树上的区间 ([l,r]) 连边。由于需要保存之前的连边情况,所以需要开成主席树。

求出 (dis) 后显然不能直接算贡献。这个 (min) 十分难搞,考虑转化成加减运算。由于只有行和列连边,整张图应该是一张二分图,而且由于 (mathtt{kxy}) 初始时是向右跑的,我们只有一个起点。所以实际上 (dis_{r(x,y)},dis_{c(x,y)}) 只会相差 (1)!那么有

[f(x,y)=frac{left(dis_{r(x,y)}+dis_{c(x,y)}-1 ight)}{2} ]

因为是整除,所以可以先算分子的和再除以 (2)。对于空白行,它的贡献就是 (discdot len),其中 (len) 是它的长度。

( ext{Code})

咕咕咕
原文地址:https://www.cnblogs.com/AWhiteWall/p/14224379.html