离散化
sort(t+1,t+1+n);
m=unique(t+1,t+1+n)-t-1;//m为不重复的元素的个数
原序列:6 9 4 6 4
排序后:4 4 6 6 9
unique(元素去掉重复的)后:4 6 9 6 9 (前m位数字无重复,其他数字跟排序后的序列想比不改变)
unique有一个返回值,例如有十个有序的数列3 3 5 5 6 6 6 7 7 8,不重复的数字有五个,使用unique去重之后数列变成了3 5 6 7 8 6 6 7 7 8,它只改变了前五个数字后边的不变,返回值是 最后一个改变的数字的地址。so:m=unique(t+1,t+1+n)-t-1;一般要减去首地址(t+1),m为不重复的数字的个数
附上代码:
int a[maxn],b[maxn];
for(int i = 1; i < n; i++) {
b[i] = a[i];
}
map<int,int>ma;
sort(b + 1,b + 1 + n);
int cnt = 1;
for(int i = 1; i <= n; i++) {
if(i == 1) {
ma[b[i]] = cnt;
} else {
if(b[i] != b[i - 1]) {
ma[b[i]] = ++cnt;
} else {
ma[b[i]] = cnt;
}
}
}
for(int i = 1; i <= n; i++) {
a[i] = ma[a[i]];
}