题目链接
POJ 2528
方法:离散化+线段树(区间替换值)
题目分析
题目大意
有一个特别长的线段,往上贴海报,贴n张,告诉每一张海报的起点x、终点y,问最终能看见几张海报。
解析
因为数据大小可能出现特别大的数字,但是特别大的数字在本题里没有什么意义,开那么大的数组既可能开不了又浪费空间,而我们只需要知道数字的大小关系即可,所以需要按数字大小将折线数字离散化成1,2,3,…,cnt。这样我们就可以造一棵cnt个点的线段树了。我们知道集合是自动去重的,所以我们每次把海报的编号插入集合,最后输出集合的size(),就是我们的结果。总结一下,我们的思路大概是这样:先将点离散化,然后把每一张海报进行编号,每次update树的时候将对应的点替换。最终将树上cnt个点全部query一遍,将每个点上的海报插入集合之中。输出内容即集合size()。
代码
此处有两种版本的代码,均可以ac,但是后者是比较好的。
当数据为
1
3
1 10
1 3
6 10
该组数据正确结果为3,错误为2。
具体原因把这组数据手写一下就明白了。
不完美版:
1 |
|
完美版:
1 |
|