zoukankan      html  css  js  c++  java
  • [agc028f]Reachable Cells

    • 题目链接

      agc028f

    • 题目大意

      给定一个 (n imes n) 的网格图,每个格子有一个权值 (w_{i,j})

      定义一个格子 (X) 可以到达 (Y) 到达当且仅当存在一条路径 (X o Y),对于其中任意一点 (Z)(w_Z eq 0),且 (i,j) 单调不减。

      求所有可达的 ((X,Y))(w_X imes w_Y) 的和。

      (nle 1500)

    • 题解

      (mathcal O(n^3)) 比较玄学,而且我也没怎么理解,就不说了。

      首先看到数据范围,就想到 (mathcal O(n^2log n)) 的复杂度,所以我们考虑分治。

      不妨令所有 (w_{i,j}=1) ,这没有影响。

      我们取一条线为分界,统计经过这条线的答案。

      设分界线的 (y) 坐标为 (mid)

      接下来我们以下半部分为例,定义一些东西:

      • (left_{i,j}:) 表示可达 ((i,j))((x,mid))(min x)

      • (right_{i,j}:) 表示可达 ((i,j))((x,mid))(max x)

      • (bottom_i:) 表示 ((i,mid)) 可达的 ((x,y))(max x)

      这些都可以直接 (mathcal O (n^2)) 递推出来。

      然后我们可以知道两个点 ((i,mid))((j,mid)) 可以共同达到的 ((x,y))(min x)

      这个我们记为 (mp_{i,j}) (具体计算方法是找到一个 (min x)((x,y)) 使得 $left_{x,y}le ile jle right_{x, y} $,如果 (min (bottom_i,bottom_j)<x),则为 (infty) ,否则为 (x) )。

      然后我们需要实现一个函数 (reach(x,y,d)) ,表示 ((x,mid),(y,mid)) 共同可达的 (ile d) 的点 ((i,j)) 的个数。

      接下来我们考虑一个点满足什么条件会被计入。

      很显然为 (left_{i,j}le xle yle right_{i,j})

      那么我们直接容斥,先加上 (left_{i,j}le x) 的,再减去 (right_{i,j}<y) 的,最后加上 (x<left_{i,j}le right_{i,j}<y) 的部分。

      但是最后一部分很不好做。

      然而我们能够发现,当点 ((i,j)) 满足 (j<mp_{x,y}) 时才会被加上,并且这部分直接用 (right_{i,j}<y) 的减去 (left_{i,j}le x) 的即可。

      这样利用前缀和可以做到 (mathcal O(1)) 实现。

      接下来我们遍历整个上半部分,计算每个点的贡献。

      显然我们可以发现,同一行中的 (left_{i,j})(right_{i,j}) 单调不减,那么这个可以抽象成这样:

      • 有一个集合 (S) 与若干区间,满足区间的 (l,r) 单调不减,集合中的元素覆盖若干点,求每个区间 ([l,r]) 中的元素覆盖的点的个数。

      那么我们需要支持:

      • 删除一个点的贡献。

      • 加入一个点的贡献并去重。

      • 统计答案。

      (has_j) 表示在询问区间中,所有满足 ((i,mid)) 可达且 (forall j>i,(j,mid)) 不可达的点的数目。

      那么显然删除就直接减去 (has_j) ,接下来考虑加入一个点。

      通过画图我们能够发现,对于一个点 ((i,mid)) ,若在序列中存在一个点 ((j,mid)) 满足 (j>i and bottom_j>bottom_i),那么再怎么加入点,点 ((i,mid)) 的答案都不会改变。

      那么考虑维护一个单调队列,只修改其中的贡献。

      令加入的点为 ((x,mid)) ,那么(has_x=reach(x,x,bottom_x))。每次修改队列中的 ((y_i,mid)) ,直接 (has_{y_i}-=reach(x,y_i,min(bottom_{y_i},bottom_x))-reach(x,y_{i},bottom_{y_{i+1}})) 即可。

      这样一行的答案就可以在 (mathcal O(n)) 的复杂度内完成,统计的复杂度是 (mathcal O(n^2))

      总复杂度 (mathcal O(n^2log n))

  • 相关阅读:
    Docker安装nexus
    docker常用操作备忘
    react-01
    SBT实操指南
    Play中JSON序列化
    SPARK安装一:Windows下VirtualBox安装CentOS
    SPARK安装三:SPARK集群部署
    SPARK安装二:HADOOP集群部署
    SLICK基础
    函数式编程
  • 原文地址:https://www.cnblogs.com/leukocyte/p/14546398.html
Copyright © 2011-2022 走看看