离散化以及区间化点——计蒜客课程记录

这是一篇涉及范围比较泛的博客,不是针对某一类题型,大概算作是思想类博客。
涉及区间处理的时候,一般不会直接以区间长度做为问题实现的区间范围,而
一般(目前以我的水平)有三类的解决方案:

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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值