离散化就是将无限空间中的值映射到有限的空间内,去提高算法的时空复杂度。
什么时候会用到离散化呢? 当一个非常大的数组需要开,但是操作的数特别少,就可一使用离散化,将间隔很大的点,映射到相邻的数组元素中,增加空间的利用。
就是大序列只要用很少,映射成小数组。用小数组来弄东西
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5
find:>=x的最小的一个数
main:
alls存离散化之后的值
加入到离散化
读入区间,下表都放到alls里面
alls去重:排序,离散化后重的放到后面,删掉
unique函数删掉重复的,新数组放前面,返回的是新数组最后一个
auto:离散化坐标加上这个数
前缀和
查询
补:unique函数返回一个迭代器,也是一个双指针算法。什么样的拿出来1.第一个2.a[i]!=a[i-1]
第一个指针遍历所有数,第二个存。j<=i
别人:![在这里插入图片描述](https://img-blog.csdnimg.cn/3048aeded4084d6a98c7b1dc58e2f2db.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pe26Ze05pyA6ICD6aqM5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
这段代码是一个二分查找的实现,用于找到一个数组中第一个大于等于给定值x的数的下标。
首先,给定的输入是一个未经离散化处理的数组alls,以及两个空的向量p和q。
函数find的参数x表示要查找的值。
函数中的变量l和r分别表示数组的左边界和右边界,初始时l为0,r为数组的长度减1。
while循环用于进行二分查找,当l小于r时,循环继续执行。
在循环内部,首先计算出中间值mid,使用位运算(右移1位)来实现除以2的操作。
然后,比较中间值对应的数组元素alls[mid]与给定值x的大小关系。
如果alls[mid]大于等于x,说明要找的数在数组的左半部分,将右边界r更新为mid。
如果alls[mid]小于x,说明要找的数在数组的右半部分,将左边界l更新为mid+1。
循环继续执行,直到l等于r时,循环结束。
最后,返回变量r作为查找结果,即第一个大于等于给定值x的数在数组中的下标。