离散化
关于离散化。
我在查资料的时候有个讲述离散化的概念的。
是让在题目不考虑大小关系时候的数据。可以离散化。这是容易理解的。
通过百度百科。矩阵67大神
发现那个VOJ(查不到了的感觉)的题目。通过另外一个数组来记录长度宽度。
我觉得其实也能考虑大小关系。不过是离散化之后的细节处理。
离散化入门。线段树。POJ 上的2528 在学习HH大神的segment tree的时候。
离散化初接触。一开始百度文库上的HH大神的文档。感觉就是他举的例子。后面论证不合理似乎没复制全。
具体的就是
1-10 1-4 6-10
1 4 6 10
1 2 3 4
1-4 1-2 3-4
对于1-4
会发现 1-2 3-4 覆盖住了1-4
我们理解一个数值是长度1的。而不是坐标。线段树上的定义也是如此。之前做过的种种题目也是如此。另外如果是坐标的数据。
也可以经过处理变成格子类型的。比如1~10 就是9个格子嘛。1~9 就是了。 经过一番考虑。坐标的只要后面那个坐标值-1 即可了。
而正是这个区间的定义。并且普通的离散化 不会考虑长度。导致了区间被似乎填满了的问题。
HH大神的 解决方案是增加点!
变成1 4 5 6 10
5是增加的点
解决了这个问题。
X[] = 1 4 5 6 10 有什么用呢? X[0] = 1.X[1] =4.X[2]=5。。。
所以可以输入l r 来根据X 来找出 所对应的离散化的数值来造树。
离散化:
大范围数据。可是使用的数据只有几个。把使用的数据离散化映射到0~N上。为什么是0~N? 线段树的性质。来造树即可。
那么我们代码需要解决的问题就是。首先是离散化的缺陷问题。弥补掉。然后我们弄线段树更新的时候输入一个值 要获得对应的映射值。
X[i] = 0~N 那么X开的区间还是要很大。 所以必须是X[0~N] = i .才可以。然后输入l r 再bin查找下标即可。
那么我们可以抽象出一个Bin(int key,int X[],int m) . m为X的大小。返回坐标。
我们来做区间更新之区间覆盖问题即可。