数组离散化
//a是原数组,b是离散化后数组。将b[i]映射成下标
int m=0;
void discreat()
{
sort(a+1,a+n+1);//排序
for(int i=1;i<=n;i++)
{
if(i==1||a[i]!=a[i-1])
b[++m]=a[i];
}//去重。m为离散化b数组的长度
}
//查询x映射为哪个1到m之间的下标
int find(int x)
{
return lower_bound(b+1,b+1+m,x)-b;
}
//去重也能用unique函数,对[a,b)区间去重,并返回b的地址
int m=unique(a+1,a+1+n)-(a+1);
哈希表离散化
unordered_map<int, int> h;
//将x映射成一个从1开始的下标
int cnt=0;
int discreat(int x)
{
if(h[x]==0) h[x]=++cnt;
return h[x];
}