做题记录 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)\)

代码

参考

posted @ 2026-04-18 10:15  Hstry  阅读(4)  评论(0)    收藏  举报