离散化算法

简介: 离散化算法

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;
    }
}
相关文章
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
153 0
|
6月前
|
人工智能 算法 C++
c++算法学习笔记 (11) 离散化
c++算法学习笔记 (11) 离散化
|
6月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
|
算法
基础算法:离散化的基本应用
基础算法:离散化的基本应用
110 0
|
机器学习/深度学习 传感器 算法
基于中心差分有限离散化和 Newton Raphson 算法求解NACA 翼型二维不可压缩和可压缩流动附matlab代码
基于中心差分有限离散化和 Newton Raphson 算法求解NACA 翼型二维不可压缩和可压缩流动附matlab代码
|
算法 C++ 容器
基础算法-离散化
1. 离散化简介 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。 离散化本质上可以看成是一种哈希,其保证数据在哈希以后仍然保持原来的全/偏序关系。 当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照从大到小编号来处理问题,即离散化。 本文针对 整数、有序数组 进行离散化。
|
存储 算法
离散化算法
如果数据范围不超过10^5可以用前缀和 否则就要用离散化
88 0
|
人工智能 算法
ACM算法训练【区间和·离散化】
1.离散化 离散化:适合条件 (数字的值域非常大,但是个数非常少) 什么是离散化:把值域大的数字的序列映射到从0开始的自然数数组里(无法开辟出值域那么大的数组)
157 1
ACM算法训练【区间和·离散化】
|
算法
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
128 0
|
25天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。