线段树小用法
第一步就把我难住了/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\) 最大的那条线段的贡献。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】