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

本文介绍了离散化技术的基本概念及其实现方法。通过具体的代码示例,展示了如何利用排序和映射表来处理区间数据,进而实现离散化的过程。适用于解决区间问题的数据结构也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值