原来一直不懂的东西呢…
后来发现也没什么,只要是专心去学习是可以搞明白的
百度百科的解释非常全面
离散化是将无限空间中有限的个体映射到有限的空间中去
具体来说就是,你需要一堆数据的相对大小,而不是绝对大小,就可以用离散化,把数据范围很大,但是数据数量很少的几个数放到一个小数组里,并且是一种映射关系
形象点,就是一个范围很大很大的数组里只有几个数,那剩下那些没有写入数据的内存不都浪费掉了吗?
这时候用离散化处理出那几个数,放到一个小数组里,就可以省时间省空间
实现
用两个元素的结构体,保存数值val和读入的次序order
读完啦之后,依据val进行排序,由于用结构体保存了order,排序后val和order依然一一对应
struct Node{
int val, order;
}node[maxn];
这时候开一个for循环和一个r数组,从1到n循环这些数字,把for循环次序赋值给这些val原来的位置,这样就没有改变原数列中的次序关系
for(int i=1; i<=n; i++) {
if(i==1 || a[i] != a[i-1]) { //去重
r[node[i].order] = i;
}
}

249

被折叠的 条评论
为什么被折叠?



