题目大意
在只考虑长度的情况下,先后放置\(n\)个海报,每个海报的范围是\([l,r]\)会覆盖下面的海报,问最后能看到几个海报。 题目链接
思路
我们可以用一个数组来表示整个区间,每次放新的海报(第\(i\)张),就把对应区间的数字改为\(i\)。
而这种区间修改我们可以直接用线段树来做(珂朵莉树也可以)
而由于区间范围比较大,我们要离散化区间。
另外需要注意的是,由于是区间覆盖问题,所以普通离散化会出问题,比如: \([1,6],[1,3],[5,6]\)离散化后会变为\([1,4],[1,2],[3,4]\),这样一来,原来第一个区间就会被完全覆盖。
这是因为,离散化操作让不相邻的点变得相邻了,这在普通问题中没有什么影响,但是在区间覆盖问题上就变得很关键了。 所以我们要在离散化数组中,插入\(r[i]+1\),防止后续点不相邻的点在离散化后和它相邻(\(l[i],r[i]\)是否相邻没有什么影响)
线段树中的tag就相当于懒标记,它意思就是表示这个区间的数被修改了为同一个数,那么查询的时候,就不用下放了,因为我们是统计有多少个海报。
代码
1 |
|
- 本文作者: 水蓝络合物
- 本文链接: https://miku39393939.github.io/2022/04/28/POJ2528/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!