用途
数据范围很大
(1~m)
,但使用的数据不大(1~n)
,且不考虑具体值,只需要用其相对大小的时候,将各个数大小从1到n进行排名
法一(无重复元素)
b[ ]中第k大的数是b[ a[ k ] ]
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=500005;
int a[maxn],b[maxn];
bool cmp(const int x,const int y)
{
return b[x]>b[y];
}
int main(){
int n;
cin<<n;
for(int i=1;i<=n;i++){
scanf("%d",&b[i]); //读入
a[i]=i; //顺便初始化一下a数组
}
sort(a+1,a+n+1,cmp); //给a数组排序,达到最终的效果
return 0;
}
法二(通用)
最大的数是1
要让最小的数是1,排序去掉cmp,二分去掉greater
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=500005;
int a[maxn],b[maxn];
bool cmp(int x,int y){return x>y;}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+n,cmp);
int cnt=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+1+cnt,a[i],greater<int>())-b;
}
return 0;
}