【题解】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\) 可以低空飘过。

浙公网安备 33010602011771号