离散化
离散化
离散化通过缩小值域来实现,
先去重在查找对应位置
通常用二分来寻找对应位置
去重函数 unique
unique在<algorithm>中
(注意在使用前要先对数组进行排序,否则即使可以运行也无法正确的实现功能)
unique返回值为当前容器中不同元素的数量同时实现去重
int m=unique(a+1,a+n);
去重后数组的有效位数只有m位而m位以后的数据则是处理后的垃圾数据
二分函数
lower_bound(a+1,a+n,v)(查找第一个小于等于v的数)
upper_bound(a+1,a+n,v)(查找第一个大于等于v的数)
要注意的是这两个函数都返回地址而不是数组下标
取下标要减去数组的地址
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long a[200005];
long long b[200005];
int c[10005];
int n;
bool cmp(long long a,long long b)
{
return a<b; //比较函数
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);//读入
b[i]=a[i];//复制一份到b数组
}
if(n==1)
{
cout<<a[1]<<' '<<'1'; //如果只有一个数特判
return 0;
}
sort(a+1,a+n,cmp); //用sort排序
int m=unique(a+1,a+n)-a;//使用unique函数去重
for(int i=1;i<=n;i++)
{
b[i]=lower_bound(a+1,a+m,b[i])-a;//查找在数组中对应位置
c[b[i]]++;//计数(如果这个位置的数出现那么++)
}
for(int i=1;i<m;i++)
{
printf("%lld %d\n",a[i],c[i]);//按题目要求从大到小输出
//因为c数组也是按1-n排序所以直接输出
}
return 0;
}