线段树小用法
第一步就把我难住了/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\) 最大的那条线段的贡献。