tricks
- 离散化线段树,通常是一些点不会被更新到,但其实还是可以作为答案的。可以把它们并成一个虚点考虑。
- P4087 [USACO17DEC] Milk Measurement S 这个题另一个重点是弄清楚什么时候统计答案,我们关心rk1的个数cnt和rk1的下标。为了维护这个要再加一个mx。
- 维护某个子串有没有出现过的01线段树,可以不用维护它拼起来的子段,状压一下更方便。因为要修改,状压完还要状压所有同长度的有没有出现。
- 信息维护答案不能通过合并得到 -> 把答案拆贡献变成可以通过合并维护的。
- P3113 [USACO14DEC] Marathon G 维护不跳过总长度及删掉一个点的最大贡献。
- 可以尝试在询问上建线段树,考虑修改对答案的贡献,如果原来的东西就是一个序列的话也要想到这也点(考虑原序列每个点对不同询问区间分别有怎么样的贡献)
- P3616 富金森林公园 先考虑某一个状态下怎么让每一位对询问区间的答案产生贡献,现考虑没有重复的,上凸的形状会在水位大于其时使答案-1,下凹则在大于其时+1(从下往上扫描线),感觉这种有类似水位的东西都可以考虑慢慢漫上来的过程,然后直接维护区间加,单调查就好了(一开始写了不是差分的树状数组,脑子进水了)。修改的时候把原来\(p-1,p,p+1\)的位置减掉然后新的加上。
- 线段树套并查集,信息注意要维护在当前这个用并查集维护了连通性的区间中,左端右端的祖先(一定要是祖先,父亲的话两端接不上),用于和别的线段树上节点合并。一定要记录下来的原因是如果全部用全局的fa数组维护连通性,之后修改的时候此区间的fa已经在维护更大区间的时候合并乱了,即维护的已经不是这个区间的连通性了。只要左右端点的原因是和别的合并只关心这个,至于其祖先可能不在两端并不重要,可以视作维护连通性的虚点。fa更应该理解为每次合并时对于此区间的临时数组,所以merge需要根据两个区间的该信息对fa进行重构。
- P4121 [WC2005] 双面棋盘 注意实现细节,对应上文 code