题目描述
时间限制:1s
空间限制:256MB
题意描述
离散化在许多题目中可以简化空间的分配方式,降低编程复杂度。现在你得到了一个数组 a[]
,你需要将其离散化得到数组 b[]
,满足对于任意 i,j :
- 若 a_i=a_j ,则 b_i=b_j
- 若 a_i<a_j ,则 b_i<b_j
除此之外,你还需要保证,如果存在 i 使得 b_i=x>1 ,则存在 j 使得 b_j=x-1 。并且存在 k 满足 b_k\ge 1
可以证明这样的离散方式是唯一的。
输入描述
第一行一个整数 n ,表示数组长度。
第二行 n 个整数 a_i ,表示a[]
数组
输出描述
一行 n 个整数 b_i ,表示b[]
数组
样例
样例输入 1
5
5 10 25 10 30
样例输出 1
1 2 3 2 4
数据范围
对于所有数据, 1\le n\le10^5,1\le a_i\le10^9
子任务 1(30 分): a_i 互不相同;
子任务 2(70 分):没有特殊限制。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
vector<int>a,c;
map<int,int>b;
cin>>n;
for(int i=0;i<n;i++){
cin>>m;
a.push_back(m);
}c=a;
sort(c.begin(),c.end());
unique(c.begin(),c.end());
for(int i=0;i<c.size();i++)b[c[i]]=i;
for(int i=0;i<n;i++)cout<<b[a[i]]+1<<" ";
return 0;
}