Loading

【题解】Ynoi 2006 rmpq

Data 是没有交换律的,意味着所有的操作都要按时间来。

如果平面上横着竖着加起来有 \(n\) 条直线,那么最多将平面划分的区域数是 \(n^2\) 级别的。不妨考虑操作分块,每 \(B\) 个修改分一个块,在一个块内维护每个区域的标记。接下来讨论一些细节:

  • 找到所属区域:找到其前面有多少竖线,上面有多少横线即可,这个可以用二分完成。
  • 散块查询信息:暴力考虑所有的询问,操作次数是 \(O(\frac{n}{B})\) 的。
  • 建立标记结构:这个我没有很好的想法,看起来要用分治结构解决。

仔细算一下操作次数,感觉会被卡。

建立标记结构可以很容易地用分治解决:合并两块的话,对于新块的每个区域,一定被旧的两块的某两个区域覆盖,直接相乘就行。

用分治结构这点启发我们用二进制分组解决问题。令 \(B=2^k\)(我选的 \(B=256\)),当某一组的大小到达 \(B\) 就不继续合并,容易发现这样子每个询问需要的费用大概是 \(\frac{m}{B}+\log_2 B\) 的(令 \(m\) 为修改次数)。

讨论二进制分组需要的费用,合并两个大小为 \(x\) 的组,需要的费用最多是 \((x+1)^2\) 的,可以看成第二个块中的每个 竖线 / 横线 去找到第一个块中的某条 竖线 / 横线 然后相互造成费用(最后除 \(2\)),因此每一个修改造成费用的次数差不多为 \(B\)

此时的操作次数经过粗略计算大概是 \(\frac{mB}{2}+\frac{(n-m)m}{B}+(n-m)\log_2B\),取 \(B=256\) 可以低空飘过。

代码:记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @ 2021-09-21 22:46  Qiuly  阅读(175)  评论(0)    收藏  举报