level 12
数据要怎么处理啊,比如贴海报一类的题,数据达到10的9次方该怎么办?
你面前是一面墙,墙上需要粘贴不同的海报。现在,你有m张不同的海报,分别需要将他们张贴在[Li,Ri]的墙上。当你把所有的海报贴完之后,你能看到多少种不一样的海报呢?时间限制:1s数据范围:
50%的数据满足 m≤ 1,000,0 ≤ Li <Ri ≤ 100,000(1 ≤ i ≤ m);
100%的数据满足 m ≤ 20,000,0 ≤ L i <R i ≤ 1,000,000,000(1 ≤ i ≤ m)。
2017年07月15日 12点07分
1
level 14
简(hu)单(luan)地解释一下
①离散化
在这里,由于数据只和相对的大小有关,我们可以用很基础的离散化方法。这里的离散化就是指把数据映射到一个小的范围内。比如这里数值范围有1e9,但是m的范围只有区区2万。那么,不同的值最多只可能有20000个,可以用离散化把那些大数缩到这个范围以内。
此处可用的,有个简单的方法是快排+二分。把原数据排序,对于每个数据二分其位置即可,当然快排后的数据可以加一个去重操作。时间复杂度O(nlogn)。对c++而言只是sort+unique+lowerbound的事。比如数据[100,50,233]离散化之后可以变成[2,1,3]这样的小范围的数据。而这些数据在本题中又是等价的。
②动态开点
即使我们认定线段树的范围大小是[1,10^9],但是我们要用到的节点数是少的。对于m次操作,我们的空间复杂度是O(mlog(10^9))的,只要在需要的时候新建节点即可。
2017年07月18日 07点07分
3
当然离散化其实是可以直接在快排的时候直接进行的。。
2017年07月18日 07点07分