JOISC2022 鱼2

记两个做法。

首先一定存在某些区间将鱼卡住不能往外吃。

容易发现区间形成树形结构,我们要查询不被任何区间覆盖的点数。

因为一个区间跳到包含区间至少会让和翻倍,所以深度是 $O(\log)$ 的。


1

赛时想了一堆笨办法维护这个树形结构,比如用树套树维护最小的包含它的区间,这样很难做到低于 $3\log$,也不知道为啥有人 $3\log$ 过了。

其实可以不用维护整个树形结构:

全局查询比较好解决,经典区间 $0$ 个数可以维护区间最值及个数解决。

单点修改会产生以其为左端点和以其为右端点的区间,这通过线段树二分很好找到。

而跨过它的区间,就比较难维护,然后补充在后面。

赛时只想到了 3log 做法。


2

Orz wry.

直接拿线段树维护合并段的关系。

对于一个段,维护 $O(\log)$ 个前缀不能向右扩展, $O(\log)$ 个后缀不能向左扩展,然后这些段之间是可以合并的,过程类似twopointers,如果可以走到整个段就统计,如果卡在中间了也统计。

也是 $\log^2$。


3: 1做法继续的思考。

超级简单不用动脑子的做法。

但是好像卡不过去。

就是直接 像 [地牢游戏] 一样 给值域 $2^k$ 分层,暴力找到修改点每层的前驱和前驱的前驱和后继和后继的后继,有且仅有这些点可能成为区间的端点——因为吃了这两个就进入了下一层,所以再靠前或者靠后就一定不会卡住它了。

但是做一次询问要做 4 次修改,端点改成无穷大再改回去。

复杂度理论 $\log^2$,常数巨大。

posted @ 2023-07-10 21:05  寂静的海底  阅读(8)  评论(0编辑  收藏  举报  来源