线段树小用法

起因:P11191 「KDOI-10」超级演出

第一步就把我难住了/kk

转换第一步:一条数轴上有 \(n\) 条颜色为 \(c_i\) 的线段,每条线段覆盖的区间为 \([l_i,r_i]\)\(q\) 次询问,每次询问给出 \(L\)\(R\),求 \([L,R]\) 中完整的线段中一共有多少种不同的颜色。

看题解说这似乎是离线扫描线,但是它叫什么并不重要。但是应该要把这种经典线段树应用给学会。

离线之后按 \(r\) 从小到大排序。

从小到大枚举一遍 \(R\),把所有 \(r_i=R\)\([1,l_i]\) 区间加一,单点查询 \(L\)

但是这样颜色相同的会算多次。

那直接把 \(r_i=R\)\(c_x=c_i(r_x<r_i)\)\([1,l_x]\) 区间减一就好了。

人话就是把同一个颜色的上次的贡献删除。也就是说颜色相同的只计算 \(r_x\le R\)\(r_x\) 最大的那条线段的贡献。

posted @ 2024-10-15 11:09  菲斯斯夫斯基  阅读(10)  评论(0编辑  收藏  举报