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})

    咕咕咕
    
  • 相关阅读:
    如何分析损益表
    如何修改windows 2008(R2)的远程桌面连接数
    08年Gartner商务智能平台魔法四分区
    浅谈BI项目——为失败BI项目解惑(转IT168)
    商业智能项目错误经验总结(三) 需求调研
    asp.net学习笔记·Cookie
    C#安全调用线程的步骤
    一般处理程序学习初步——最简单的一般处理程序
    asp.net学习笔记·get与post区别
    C#中使用DES和AES加密解密
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/14224379.html
Copyright © 2011-2022 走看看