离散化
- 值得注意的是:unique()函数去重之后并不是把重复元素放在最末尾,而是类似于删除了这个数,然后末尾元素保持不变,比如
1 2 2 3
去重之后是1 2 3 3
,这里大部分博客都是错的。至少我用代码跑出的结果是这样的,所有去重之后的数组不能乱用。
//discretiza
sort(t,t+n);
int m=unique(t,t+n)-t;//得到去重之后的元素个数
//两种写法
//预处理
for(int i=0;i<n;i++){
a[i]=upper_bound(t,t+m,a[i])-t;
}
//离散化后的值从0开始
//a[i]为离散化后**原数组**对应的值
//t[]为排序后的顺序
//t[a[i]]为原数组对应的值
//每次使用的时候查询
inline int find(int x){
return lower_bound(a, a + m, x) - a;
}