这是一篇涉及范围比较泛的博客,不是针对某一类题型,大概算作是思想类博客。
涉及区间处理的时候,一般不会直接以区间长度做为问题实现的区间范围,而
一般(目前以我的水平)有三类的解决方案:
1、区间化为点,将不同的区间通过差分的方式化成一个点,维护好不同类型的区间。如果涉及计算,在维护区间的时候可以用前缀和的方式维护(不支持修改,或修改的复杂度为o(n)级)
2、查询排序化,见之前的博客
3、离散化,本篇的主角
先贴代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 3e5+5;
int num[MAX_N];///原数据
int tp[MAX_N];///中间排序数据
map<int,int> M;//离散数据映射
int ans[MAX_N]; ///离散后对应编号
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",num+i);
tp[i+1] = num[i];
}
sort(tp+1,tp+n+1,less<int>());
int ind = unique(tp+1,tp+n+1) - tp;
for(int i=1;i<ind;i++){
M[tp[i]] = i;
}
for(int i=0;i<n;i++){
ans[i] = M[num[i]];
printf("%d ",ans[i]);
}
return 0;
}
-
需要的数据结构:
- 1、原数组,中间数组,以及离散映射map
- 2、原数据编号ans数组
实现方式:
对中间数组进行排序,存到map中,在通过顺序访问num[i]放入ans中