离散化
离散化有很大的局限性(目前以个人认知来说),几乎只适合在树状数组求逆序对使用。
离散化概念
离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
离散化实现
建立一个结构体包含\(val\)和\(id\),\(val\)就是输入的数,\(id\)表示输入的顺序。然后按照\(val\)从小到大排序,如果\(val\)相等,那么就按照\(id\)从小到大排序。
如果不明白我们可以举了个例子:
结构体内:
val 10 100 1 6
id 1 2 3 4
排序后结构体内:
val 1 6 10 100
id 3 4 1 2
两者的逆序对都是:4
总结一下:把原序列中每个元素的值和下标存到结构体内,之后把数组按元素值从小到大排序,数值相同\(id\)小的在前,这样得到的结点的下标值即是离散化结果,等同于原序列的数值。
//val数值 id下标 n 原数组大小
struct node{
int val, id;
bool operator < (const node & rhs) const{
return (this->val < rhs.val) || (this->val == rhs.val && this->id < rhs.id);
}
}arr[MAXN];
for(int i = 1; i <= n; i++){
cin >> arr[i].val;
arr[i].id = i;
}
sort(arr+1,arr+1+n);
for(int i = 1; i <= n; i++){
cout << arr[i].id << " ";
}