离散化
1 如何实现离散化?
2 解析
我们可以发现,最后归位后的数组就对应的是
怎么用代码实现?
这道题要有两个数组,一个原数组,设为
第一步没啥好说的,对原数组排序。
第二步之前要进行去重,我们可以用 STL 中的一个神奇的函数:
具体来说,这个函数可以去除数组中的相邻重复项,并返回指向最后一个前移覆盖位置的迭代器。因此想要完全去重就必须先排序。虽然说是去重,本质上其实是让后面的数覆盖掉重复的数。那么因此我们就可以利用这个函数对原数组进行去重并计算出去重后的个数。
去重后的个数会用到一行神奇的代码:
第二步根本就不用写代码,可以直接进第三步。
第三步也要用到一个函数:
3 代码
#include <bits/stdc++.h>
using namespace std;
int a[100005], d[100005]; //原数组和离散化数组
int main()
{
ios::sync_with_stdio(0);
int T, n;
cin >> T;
while (T--)
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
d[i] = a[i]; //同步原数组数据
}
sort(a + 1, a + n + 1); //第一步排序
int cnt = unique(a + 1, a + n + 1) - (a + 1); //去重
for (int i = 1; i <= n; i++)
d[i] = lower_bound(a + 1, a + cnt + 1, d[i]) - a; //第三步归位
for (int i = 1; i <= n; i++)
cout << d[i] << " ";
cout << endl;
}
}