ptt

[APIO2018]新家——线段树

两盒软妹~` 提交于 2019-12-01 05:38:17
题面    LOJ#2585 解析    看到这个题,第一反应就是离线按时间排序,枚举时间节点,用某种数据结构维护当前时间点的信息   然后我就不知道怎么维护了   结果是线段树?   当然维护信息的过程很巧妙,但需要想到二分长度,把询问转化为在区间$[x-mid, x+mid]$内是否存在$k$种商店才可能想到用线段树维护信息   线段树中每个叶子节点存与这个点具有相同类型的商店的前驱,但有可能多个商店在同一个点,因此就存所有前驱的最小值, 如果这个点没有了商店,那这个值就是$inf$,但也有可能多个相同类型的商店在同一个点,因此存下标小于这个点的前驱,由于有插入商店与删除商店的操作,因此对每个叶子节点开一个$multiset$维护信息,取出最小的元素作为当前叶子节点的值,再向上更新父亲节点即可。而为了在插入一个商店时可以快速确定它的前驱与后继进行修改,每一个商店类型也都需要开一个$multiset$维护这个类型的所有商店的下标。为了防止找不到前驱或后继的情况,在每个类型的商店的$multiset$中都插入$inf$与$-inf$,当然,相应地,就需要在线段树的$inf$处插入前驱$-inf$,总共插入$k$次   有了线段树维护信息,那么怎么判定当前二分的区间?   因为我们维护了前驱的下标,判定在区间$[x-mid, x+mid]$内是否存在k种商店, 变成判定在$(x