题目·:B3694 数列离散化 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
分析:先对数组元素大小排序 sort()就欧克,去重 手写或者unique()新数组在原数组全部元素找大于等于这个数 的第一个数,返回lower_bound()。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define N 1000005
int a[N],b[N];
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
//排序
sort(a+1,a+n+1);
//去重,指向去重后不重复系列最后一个元素的下一个
//int inv=unique(a+1,a+n+1)-(a+1);
int cnt=0;
for(int i=1;i<=n;i++){
if(i==1||a[i]!=a[i-1])
a[++cnt]=a[i];
}
for(int i=1;i<=n;i++){
b[i]=lower_bound(a+1,a+cnt+1,b[i])-a;//lower_bound(fist,last,val),查找大于等于val,然后返回对于下标
cout<<b[i]<<" ";
} //upper_bound,返回大于下标
cout<<"\n";
}
return 0;
}
2024.2.13,东