做题记录 26.4.17
QOJ #7980. 区间切割
对于区间 \([l,r]\),若不切到 \([l+\lfloor\frac{r-l}3\rfloor,r-\lfloor\frac{r-l}3\rfloor]\) 中,则必然保留中间部分,否则区间长度至少减少 \(\frac 13\)
离线,扫描线,用一棵线段树维护当前结点用到的操作,每个区间维护位置范围内最小时间
对于每个操作,特判 \(r-l\le 2\) 的情况
找到 \([l+\lfloor\frac{r-l}3\rfloor,r-\lfloor\frac{r-l}3\rfloor]\) 中第一次操作(显然是必然在上一次关键操作之后),用这次操作之前 \([l,l+\lfloor\frac{r-l}3\rfloor)\) 内最靠右的操作跟新左端点,\((r-\lfloor\frac{r-l}3\rfloor,r]\) 内最靠左的操作更新右端点,然后处理这一操作
时间复杂度 \(O(m\log m+n\log^2m)\)
QOJ #967. Rectangle Painting
使用 \(\text{ODT}\) 维护每一行的白色连续段,则可以转化为 \(O(q)\) 次插入连续段删除连续段(不精细则为 \(O(q+V)\) 次)
每次查询相当于求和当前区间有交的白色连续段中坐标最小的
可以转化为每个点维护一个可重集,区间插入,区间查询可重集最小值的最大值
容易线段树维护,时间复杂度 \(O((q+V)\log V\log q)\),精细实现可以做到 \(O(q\log^2 q)\)
\(\textcolor{black}\odot\) P9530 [JOIST 2022] 鱼 2 / Fish 2
线段树维护答案,每个结点维护若干二元组,每个 \((l,r)\) 表示区间内存在一个位置,它可以到达的极大范围为 \((l,r)\)
对于区间 \([L,R]\),显然 \(L<l\land r<R\) 的对答案无贡献,可以忽略
显然 \((L,r)\) 的数量不超过 \(O(\log V)\),因此去重后只需要保存 \(O(\log V)\) 的信息
合并容易做到 \(O(\log V\log \log V)\),精细实现可以做到 \(O(\log V)\)
总时间复杂度 \(O((n+q\log n)\log V\log\log V)\)

浙公网安备 33010602011771号