离散化算法

简介: 离散化算法

y总模板:


vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素
// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{
int l = 0, r = alls.size() - 1;
while (l < r)
{
int mid = l + r >> 1;
if (alls[mid] >= x) r = mid;
else l = mid + 1;
}
return r + 1; // 映射到1, 2, ...n
}


区间和问题:


https://www.acwing.com/problem/content/804/


 import java.util.*;
public class Main {
    static int N=300010; //因为需要将所有x,l,r存在数组中,这样就是n + 2m <= 300000
    public static void main(String[] args)  {
        int []a=new int[N]; //存储坐标插入的值
        int []s=new int[N]; //存储a数组的前缀和
        List<Integer> alls=new ArrayList<>(); //存储(所有与插入和查询有关的)坐标 ,比如x、l、r
        List<Pairs> add = new ArrayList<>(); //用来存n次操作
        List<Pairs> query = new ArrayList<>(); //用来存m次询问
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m= sc.nextInt();
        for (int i = 0; i <n; i++) {
            int x=sc.nextInt();  int c= sc.nextInt();
            alls.add(x);
            add.add(new Pairs(x,c));
        }
        for (int i = 0; i <m; i++) {
            int l=sc.nextInt(); int r=sc.nextInt();
            alls.add(l); alls.add(r);
            query.add(new Pairs(l,r));
        }
        //利用HashSet对数组进行去重,然后排序
        alls=new ArrayList<>(new HashSet<>(alls));
        Collections.sort(alls);
        //执行n次插入
        for (Pairs pairs : add) {
            int index=find(pairs.first,alls);
            a[index]+= pairs.second;
        }
        //求前缀和
        for (int i = 1; i <=alls.size(); i++) {
            s[i]=s[i-1]+a[i];
        }
        //执行n次查询操作
        for (Pairs pairs : query) {
            int l=find(pairs.first, alls);
            int r=find(pairs.second, alls);
            System.out.println(s[r]-s[l-1]);
        }
    }
    public static Integer find(int x, List<Integer> alls){
    int l=0,r=alls.size()-1;
        while (l<r){
        int mid=l+r>>1;
          if(alls.get(mid)>=x) r=mid;
          else l=mid+1;
        }
        //考虑到求前缀和,下标手动加1
        return l+1;
    }
}
class Pairs {
    int first;
    int second;
    public Pairs(int first, int second) {
        this.first = first;
        this.second = second;
    }
}
目录
打赏
0
0
0
0
1
分享
相关文章
基础算法:离散化的基本应用
基础算法:离散化的基本应用
153 0
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
ACM算法训练【区间和·离散化】
1.离散化 离散化:适合条件 (数字的值域非常大,但是个数非常少) 什么是离散化:把值域大的数字的序列映射到从0开始的自然数数组里(无法开辟出值域那么大的数组)
192 1
ACM算法训练【区间和·离散化】
基于中心差分有限离散化和 Newton Raphson 算法求解NACA 翼型二维不可压缩和可压缩流动附matlab代码
基于中心差分有限离散化和 Newton Raphson 算法求解NACA 翼型二维不可压缩和可压缩流动附matlab代码
基础算法-离散化
1. 离散化简介 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。 离散化本质上可以看成是一种哈希,其保证数据在哈希以后仍然保持原来的全/偏序关系。 当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照从大到小编号来处理问题,即离散化。 本文针对 整数、有序数组 进行离散化。
离散化算法
如果数据范围不超过10^5可以用前缀和 否则就要用离散化
137 0
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
163 0
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等