zoukankan      html  css  js  c++  java
  • 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})

    咕咕咕
    
  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/14224379.html
Copyright © 2011-2022 走看看