hzoi898 交通网络 题解?
Underground
是那个纯音乐啦~
Ans
注意到:一个只能说真话,一个绝不说假话。
这题有四样读法,你知道么?
出一个毒瘤 ds 的最好方式就是把序列问题直接出到树上,考察选手树剖能力。
正确的题意:
给定一棵树,在时刻 \([tl, tr]\) 链加,查时刻 \(t\) 时链上值不为 \(0\) 的边数。
这个题没啥意思,区间加(任意时刻序列中的值 \(\ge 0\)),区间数 \(0\) 板子,并且还放暴力过了。
考虑一个有点意思的错误读法。
时刻 \([tl, tr]\) 区间加,查时刻 \(t\) 时区间值不为 \(0\) 的极长连续段数。
有两种做法:
-
Qyun 式:
考虑直接标记永久化,删除的时候直接用其两个儿子更新就可以了。
-
wang54321 式:
考虑维护区间 \(0\) 的个数 \(x\) 和区间连续两个都是 \(0\) 的个数 \(y\)。
发现对于一个区间极长段数 \(= \frac{x * 2 - y * 2}{2} = x - y\)。
考虑每两个数之间插入一个虚点,其值是这两个数的和,于是区间连续两个都是 \(0\) 的数的个数等于区间虚点 \(0\) 的个数。
分别维护原序列和虚点即可。
稍微扩展一下也是容易的,考虑:区间加(任意时刻序列中的值 \(\ge 0\)),区间值不为 \(0\) 的极长连续段数。
2 直接就可以做,1 发现其标记永久化的意义是保证其儿子的值是对的,并且标记始终在其能在的最上层(为了保证查询当前节点时一定有标记),其实是可以推标记的,考虑两个儿子标记如何合并到其父亲,本质上是取 min,但是需要维护节点信息,考虑每个节点维护一下其没有标记时的信息(大概是段数、左右端点是否有值),加上一些分讨还是可以向上传递的。
上树也是直接上,就是有不少细节。
P
补一下昨天的 zzz 图