排序
去重
a数组是要被离散化的数组 cp数组拷贝a数组
a数组里有5个数据
666666669 666666661 666666661 666666661 666666668
对cp排序后
666666661 666666661 666666661 666666668 666666669
去重
stl的unique 之后相同的元素会自动到后面去
666666661 666666668 666666669 666666661 666666661
最后遍历a数组 在cp数组里查找a的值,返回下标。可二分查找
如果想要离散化之后的结果从0开始就用lower_bound
想要从1开始就用upper_bound(这里是cp数组从0下标开始的前提下)
离散化后
a数组的值就是
3 1 1 1 2
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n;
int arr[N];
vector<int>xs;
void print()
{
for(int i=1;i<=n;i++)
printf("%d ",arr[i]);
puts("");
}
int main()
{
scanf("%d",&n);
vector<int>::iterator it;
for(int i=1;i<=n;i++)
{
scanf("%d",&arr[i]);
xs.push_back(arr[i]);
}
sort(xs.begin(),xs.end());
vector<int>::iterator e=unique(xs.begin(),xs.end());//不同元素的个数 好像也能用auto替换vector<int>::iterator 只不过我的编译器用不了
for(int i=1;i<=n;i++)
arr[i]=upper_bound(xs.begin(),e,arr[i])-xs.begin();
print();
return 0;
}