方格问题

考虑如何回答询问。
由于每个格子被加成多少在询问某个时间很难具体得知(或者得知时间复杂度太高),所以要换一种思路。
注意到每个格子加上的都是正数,所以一个格子如果\(\geq L\),则在后面的时刻它都会\(\geq L\)
考虑求出一个格子\(\geq L\)的时间,这是个经典的问题(集训队作业矩阵乘法),使用扫描线+二维bit+整体二分即可解决。
但是由于每一个格子出现的时间都在询问的时间之前,所以使用扫描线+bit即可计算。
此部分时间复杂度\(O(nm\log_2^2nm)\)
\(p_{i,j}\)表示\(i,j\)被加到\(\geq L\)的时间。
定义某路径长度为它经过的所有格子的\(p\)的最小值\(mn\)
设当前询问时间为\(t\),则当\(mn>t\)的时候可以到达。
求出\(mn\)也是个经典的问题(ZJOI2016 旅行者)。
对网格沿着短边分治,在短边处合并答案。
处理必须经过中线一个点的答案。
从左边每个点到中线,右边每个点到中线进行dp。
这样子一次询问时间复杂度最坏也不会超过\(\sqrt{nm}\)
套用旅行者的分析可得时间复杂度为\(O(nm\log_2^2nm+nm\sqrt{nm}+q\sqrt{nm})\)

posted @ 2020-11-12 09:38  celerity1  阅读(122)  评论(0编辑  收藏  举报