洋文

中文
\(\mathtt{kxy}\) 又微醺啦!醉鹅从坐标为 \((1,1)\) 的酒吧出来,在 \(n\times n\) 的大街上乱跑!注意,\(\mathtt{kxy}\) 初始时是向右跑的!
大街上充满了危险,有 \(m\) 个位置存在 \(\mathtt{lt}\)(别问我为什么 \(\mathtt{lt}\) 多达 \(10^5\) 个),如果 \(\mathtt{kxy}\) 跑到这种位置就会触发 \(\mathtt{lt}\)!醉鹅虽然醉了,但是只聪明鹅,不会跑入这种位置。
鹅跑是因为鸭捉,鸭捉是因为鹅跑。
\(\mathtt{qbt}\) 自觉跑不过醉鹅,心生一计,决定在原地守株待鹅。她会在某些方格放一瓶 "勇闯天涯",当醉鹅到达此方格就会转向(当然我们的 \(\mathtt{qbt}\) 是只聪明鸭,醉鹅转的方向由 \(\mathtt{qbt}\) 决定)。她会在所有的方格实施这个计划,不过经费有限,你需要算出 \(\text{Ans}=\sum f(x,y)\),其中 \(f(x,y)\) 是 \(\mathtt{qbt}\) 在方格 \((x,y)\) 时使 \(\mathtt{kxy}\) 跑入自己怀里的最少 "勇闯天涯" 数。需要注意的是,如果 \(\mathtt{kxy}\) 无论如何跑不到此方格,\(f(x,y)=0\)。
\(n\le 10^5\)。
\(\text{Solution}\)真的啥也不会。
首先这个数据范围就应该意识到不是将空白行/列看成点就是用 \(m\) 个障碍来做。
这里是用空白行/列(我们定义空白行/列为连续无障碍的区间)。可以计算一下这个的空间复杂度:对于空白行,如果没有障碍就是 \(n\) 条,发现多一个障碍就会多划分出一个空白行,空白列同理。空间复杂度大约 \(n+m\)。
如何维护 "转向" 的操作?考虑如果有两个相交的空白行和空白列,就在它们之间连一条边权值为 \(1\)。
设 \(dis_u\) 为 \((1,1)\) 所在的空白列到 \(u\)(这是空白列/行的编号)的最短距离,\(r(x,y),c(x,y)\) 分别是 \((x,y)\) 所在的空白行/列编号。那么有:
如何建图?考虑用扫描线 + 线段树维护每一行对应的空白列,再对于此行的空白行 \((l,r)\),将它与线段树上的区间 \([l,r]\) 连边。由于需要保存之前的连边情况,所以需要开成主席树。
求出 \(dis\) 后显然不能直接算贡献。这个 \(\min\) 十分难搞,考虑转化成加减运算。由于只有行和列连边,整张图应该是一张二分图,而且由于 \(\mathtt{kxy}\) 初始时是向右跑的,我们只有一个起点。所以实际上 \(dis_{r(x,y)},dis_{c(x,y)}\) 只会相差 \(1\)!那么有
因为是整除,所以可以先算分子的和再除以 \(2\)。对于空白行,它的贡献就是 \(dis\cdot len\),其中 \(len\) 是它的长度。
\(\text{Code}\)咕咕咕
















