Fish 2
很有意思的题。记 \(V = 10^9\)。
首先默认 \(a_0 = a_{n + 1} = +\infty\)。对于一个点 \(i\),能吃就吃,最终会遇到两个边界 \(l - 1, r + 1\),满足 \(\sum\limits_{j=l}^r a_j < \min(a_{l - 1}, a_{r + 1})\)。假设当前边界为 \(l - 1, r + 1\),先把 \([l, r]\) 内的鱼都吃光再尝试能否吃 \(a_{l - 1}\) 或 \(a_{r + 1}\),如果可以吃,重新找两个边界 \([l', r']\),且吃了后整个区间的大小至少翻倍,所以最多拓展 \(\log V\) 次,设最后完全不能拓展的区间为 \([l_i, r_i]\)。
有一些显然的结论,比如 \([l_i, r_i]\) 是要么包含,要么不交的,因为如果相交,假设是 \([l_j, r_j], l_j \le r_i, r_j \ge r_i\),则 \(\sum\limits_{k = l_j}^{r_j} a_k > a_{r_i + 1} > \sum\limits_{k = l_i}^{r_i} a_k\),于是 \(l_j\) 一定 \(\le l_i\)。我们把 \([l_k, r_k]\) 相同的 \(k\) 视为一个等价类,那么包含 \(i\) 的等价类个数只有 \(\mathcal{O}(\log V)\) 个,即包含 \(i\) 的本质不同的区间 \([l_k, r_k]\) 只有 \(\mathcal{O}(\log V)\) 个,证明显然。
给定了所有 \([L, R]\) 内的鱼,则 \(i\) 可以存活当且仅当 \(l_i \le L \le R \le r_i\)。
发现查询非常不好做,我们考虑如何根据若干信息得到答案。由于要求带修,不妨试试用线段树来维护。我们令 \(\forall i \in [L, R], [l_i, r_i] \subseteq [L, R]\),等合并向父节点时再拓展 \([l_i, r_i]\)。
令 \(M = \frac{L + R}{2}\),那么 \([L, R]\) 的答案要从 \([L, M]\) 和 \([M + 1, R]\) 转移来,我们考虑 \([L, M]\) 中的一些 \([l, r]\) 如何拓展到 \([L, R]\),发现只需要考虑 \([L, M]\) 中能拓展到 \(M\) 的 \([l, r], r = M\),再尝试拓展。由于是包含的,先从小的区间拓展,且拓展后的右端点一定是右儿子的某个 \([M + 1, r]\) 的 \(r\),我们惊人的发现,由于经过 \(M\),所以不同的 \([l, M]\) 只有 \(\log V\) 个,由于经过 \(M + 1\),不同的 \([M + 1, r]\) 只有 \(\log V\) 个!于是我们之间双指针维护当前的 \([l, M]\) 和 \([M + 1, r]\),每次尝试拓展,复杂度就是对的。
那么我们就需要对每个节点记以下信息:所有 \([L, r], [l, R]\)。信息合并都是容易的,如果不知道可以参考 @Alex_Wei 老师的题解。
时间复杂度 \(\mathcal{O}(n \log n + q \log n \log V)\)。
双倍经验:CF1990F Polygonal Segments

浙公网安备 33010602011771号