【算法基础】(一)基础算法 --- 离散化

请添加图片描述

✨个人主页:bit me
✨当前专栏:算法基础
🔥专栏简介:该专栏主要更新一些基础算法题,有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下,互相监督打卡学习 🌹 🌹 🌹

区 间 和

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0 。
 
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
 
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。

输入格式:

第一行包含两个整数 n 和 m。
 
接下来 n 行,每行包含两个整数 x 和 c。
 
再接下来 m 行,每行包含两个整数 l 和 r。

输出格式:

共 m 行,每行输出一个询问中所求的区间内数字和。

数据范围:

−10 ^ 9 ≤ x ≤ 10 ^ 9,
 
1 ≤ n,m ≤ 105,
 
−10 ^ 9 ≤ l ≤ r ≤ 10 ^ 9,
 
−10000 ≤ c ≤ 10000

输入样例:

3 3
1 2
3 6
7 5
1 3
4 6
7 8

输出样例:

8
0
5

思路:

结合我们前缀和与二分的思想,对数据进行数组储存然后实现排序去重

  1. 用数组来存储我们的值,前缀和以及下标。
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//n次操作
int m = scanner.nextInt();//m次询问
int N = 300010;//开辟最大数组
int[] a =  new int[N]; //存值
int[] s = new int[N];//存前缀和
List<Integer> alls = new ArrayList<>();//存储下标
  1. 为了避免有重复乱序的,我们还需要去重然后排序
  • 准备工作
List<Pair> add = new ArrayList<>();//用来存n次操作
List<Pair> query = new ArrayList<>();//用来存m次询问
//输入n次操作,每次操作存入add集合中,然后将下标x存入alls集合中
for(int i = 0 ; i < n ; i ++ ){
    int x = scanner.nextInt();
    int c = scanner.nextInt();
    add.add(new Pair(x,c));
    alls.add(x);
}
//输入m次询问,每次询问存入query集合中。l,r都存入alls集合中。
for(int i = 0 ; i < m ; i ++ ){
    int l = scanner.nextInt();
    int r = scanner.nextInt();
    query.add(new Pair(l,r));
    alls.add(l);
    alls.add(r);
}
  • 排序
Collections.sort(alls);   //排序
  • 去重
int unique = unique(alls);  //去重

public static int unique(List<Integer> list){
    int j = 0;
    for(int i = 0 ; i <= list.size() - 1; i ++ ){
        if(i == 0 || list.get(i) != list.get(i-1)){
            list.set(j,list.get(i)); //将不重复之后的数一个一个重新存入list中。
            j ++ ;
        }
    }
    return j;
}
  1. 下标的查找,以及前缀和与二分查找的结合
  • 前缀和
for(int i = 1 ; i <= alls.size() ; i ++ ) s[i] = s[i-1] + a[i]; 
  • 二分
public static int find(int x ,List<Integer> list){
    int l  = 0;
    int r = list.size() - 1;
    while(l < r){
        int mid = ( l + r )/ 2;
        if(list.get(mid) >= x) r = mid;
        else l = mid + 1;
    }
    return l + 1;
}
  • 下标的询问查找
for(Pair item : query){
    int l = find(item.first,alls); //
    int r = find(item.second,alls); //
    System.out.println(s[r] - s[l-1]); //
}
  1. Pair类的实现
class Pair{
    int first;
    int second;
    public Pair(int x,int c){
        this.first = x;
        this.second = c;
    }
}

附上总的代码

public class Demo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//n次操作
        int m = scanner.nextInt();//m次询问
        int N = 300010;//表示需要用到的下标数量,因为一开始可能重复,所以按照最大可能开最大的数组;
        int[] a =  new int[N]; //用来存值,从一开始的值,因为要用到前缀和,所以0不操作;
        int[] s = new int[N];//用来存前缀和,从一开始进行记录a数组;
        List<Integer> alls = new ArrayList<>();//用来存所有的下标,x,l,r;
        //因为可能会重复乱序,所以需要进行去重,排序;
        List<Pair> add = new ArrayList<>();//用来存n次操作
        List<Pair> query = new ArrayList<>();//用来存m次询问
        //输入n次操作,每次操作存入add集合中,然后将下标x存入alls集合中
        for(int i = 0 ; i < n ; i ++ ){
            int x = scanner.nextInt();
            int c = scanner.nextInt();
            add.add(new Pair(x,c));
            alls.add(x);
        }
        //输入m次询问,每次询问存入query集合中,因为l,r是求和的下标区间和,所以l,r都存入alls集合中。
        for(int i = 0 ; i < m ; i ++ ){
            int l = scanner.nextInt();
            int r = scanner.nextInt();
            query.add(new Pair(l,r));
            alls.add(l);
            alls.add(r);
        }

        Collections.sort(alls);   //排序,现在alls集合中存的是x,l,r所有值
        int unique = unique(alls);  //这一步是去重,因为l,x,r中可能有重复的数;
        alls = alls.subList(0,unique);  //将去重之后的alls的长度范围中的值重新赋值给alls集合中。

        //增强for循环 for(元素类型 变量名 : 数组或者集合) 缺点:无下标,简单。
        for(Pair item : add){
            int index = find(item.first,alls);//
            a[index] += item.second;//
        }

        for(int i = 1 ; i <= alls.size() ; i ++ ) s[i] = s[i-1] + a[i]; //这是前缀和公式代码

        for(Pair item : query){
            int l = find(item.first,alls); //
            int r = find(item.second,alls); //
            System.out.println(s[r] - s[l-1]); //
        }

    }
    //去重(只要符合是第一个数或者后面一个数不等于前面一个数就是不重复的数)
    public static int unique(List<Integer> list){
        int j = 0;
        for(int i = 0 ; i <= list.size() - 1; i ++ ){
            if(i == 0 || list.get(i) != list.get(i-1)){
                list.set(j,list.get(i)); //将不重复之后的数一个一个重新存入list中。
                j ++ ;
            }
        }
        return j;
    }
    //二分查找(在集合中查找你现在的下标是在什么位置,因为需要符合我们要用的前缀和公式,要让下标不是从0输出,最低的下标是1,符合前缀和的从1开始,所以输出的值加1)
    public static int find(int x ,List<Integer> list){
        int l  = 0;
        int r = list.size() - 1;
        while(l < r){
            int mid = ( l + r )/ 2;
            if(list.get(mid) >= x) r = mid;
            else l = mid + 1;
        }
        return l + 1;
    }
}

//这是一个Pair类,用来存操作的类
class Pair{
    int first;
    int second;
    public Pair(int x,int c){
        this.first = x;
        this.second = c;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7616.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试,自学3个月出来就是高薪工作?你以为还是2019年以前?

朋友&#xff0c;作为一个曾经从机械转行到IT的行业的过来人&#xff0c;已在IT行业工作4年&#xff0c;分享一下我的经验&#xff0c;供你参考。 讲真&#xff0c;现在想通过培训班培训几个月就进入IT行业&#xff0c;越来越来难了&#xff1b;如果是在2018年以前&#xff0c;…

Spark 算子

目录 什么是Spark rdd算子 算子的分类 Transformation算子 Action算子 转换算子 Value类型 map mapPartitions mapPartitionsWithIndex glom groupBy filter sample distinct coalesce sortBy 双Value类型 intersection union subtract zip K-V类型 par…

【Java基础】-【SpringMVC】

目录什么是MVC&#xff1f;DAO层是做什么的&#xff1f;Spring MVC的执行流程Spring MVC常用注解Spring MVC的拦截器怎么去做请求拦截&#xff1f;其他cookie和session的区别cookie和session各自适合的场景session的工作原理get请求与post请求的区别get请求的参数能放到body里面…

JAVASE基础(一)

这里写目录标题一、javaSE基础1.jdk文档2.代码量统计工具3.文档注释4.反编译工具5.JDK、JRE、JVM&#xff08;java虚拟环境&#xff09;*6.变量命名规则7.变量的作用域8.数据类型9.进制10.反汇编器javap一、javaSE基础 1.jdk文档 Overview (Java Platform SE 8 ) (oracle.com…

stable-diffusion安装和简单测试

参考&#xff1a; https://github.com/CompVis/stable-diffusion 理解DALLE 2&#xff0c; Stable Diffusion和 Midjourney的工作原理 Latent Diffusion Models论文解读 【生成式AI】淺談圖像生成模型 Diffusion Model 原理 【生成式AI】Stable Diffusion、DALL-E、Imagen 背後…

面向对象编程(基础)3:对象的内存解析

目录 3.1 JVM内存结构划分 3.2 对象内存解析 举例&#xff1a; 内存解析图&#xff1a; 面试题&#xff1a;对象名中存储的是什么呢&#xff1f; 3.3 练习 3.1 JVM内存结构划分 HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分&#xff08;Runtime …

python字符编码

目录 ❤ 前言 文本编辑器存取文件的原理&#xff08;nodepad&#xff0c;pycharm&#xff0c;word&#xff09; python解释器执行py文件的原理 &#xff0c;例如python test.py 总结 ❤ 什么是字符编码? ASCII MBCS Unicode ❤ 字符编码的发展史 阶段一: 现代计算…

vue - vue中混入mixin的使用

vue中mixin混入的使用1&#xff0c;概念2&#xff0c;使用场景3&#xff0c;开始使用4&#xff0c;局部混入和全局混入5&#xff0c;总结1&#xff0c;概念 官方解释&#xff1a; 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue 组件中的可复用功能。一个混入对…

Python 自动化指南(繁琐工作自动化)第二版:十七、计时、安排任务和启动程序

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter17/ 坐在电脑前运行程序是没问题的&#xff0c;但让程序在没有你直接监督的情况下运行也很有用。您计算机的时钟可以安排程序在某个指定的时间和日期或定期运行代码。例如&#xff0c;你的程序可以每小时抓取一个…

Python 自动化指南(繁琐工作自动化)第二版:十三、使用 EXCEL 电子表格

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter13/ 虽然我们不经常将电子表格视为编程工具&#xff0c;但几乎每个人都使用它们将信息组织成二维数据结构&#xff0c;用公式执行计算&#xff0c;并以图表的形式产生输出。在接下来的两章中&#xff0c;我们将把…

Window10平台下编译Sqlite3.4

1、下载网址&#xff1a;SQLite Download Page 需要下载如下内容&#xff1a; 我这里下载64位的dll 2、我用的vs2019新建一个windows桌面项目&#xff0c;应用程序类型:动态链接库(.dll),空项目&#xff1a; 3、将如下文件复制到工程目录下&#xff0c;然后添加到工程中 添加到…

动力节点老杜Vue笔记——Vue程序初体验

目录 一、Vue程序初体验 前言 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 前言 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;这些对我们编写Vue程序起不到太大的作…

koa开发实践2:为koa项目添加路由模块

nodeJS server-side-developkoa开发实践2&#xff1a;为koa项目添加路由模块上一节&#xff1a;《 koa开发实践2&#xff1a;为koa项目添加路由模块 》| 下一节&#xff1a;《 koa开发实践3&#xff1a;在koa项目中使用 swagger 文档 》作者&#xff1a; 李俊才&#xff1a;…

哪些是真正的全光谱灯品牌呢?推荐五款全光谱护眼灯

所谓全光谱&#xff0c;就是指灯光的色谱成分无限接近太阳光的色谱成分。我们都知道&#xff0c;太阳光不单单只有一束简单的白光&#xff0c;而是有很多种颜色的单色光复合而成&#xff0c;所以它的色彩显色效果非常丰富、真实&#xff0c;这些单色光也成了太阳光的色谱成分。…

浅谈机器学习--聚类

还不了解机器学习&#xff1f;来看&#xff01; 目录 一.聚类 二.k均值聚类算法(k-means) 1.k均值聚类算法的流程 二.k均值算法的改进 1.二分k-means算法 2.k-means算法 3.k-medoids算法 4.Mini Batch k-means算法 三.DBSCAN算法 1.​编辑-邻域 2.核心点和边界点 …

关于TextureRender适配的解决方案

当我们用摄像机渲染出一个图片&#xff0c;显示在UI的时候&#xff0c;会发现&#xff0c;你如果自适配&#xff0c;那么就会拉伸图片&#xff0c;导致人物或者场景变形。 我最近就遇到了这个事&#xff0c;这里我给出几种问题和解决方案&#xff1a; 1 &#xff1a;当我们想…

NSSCTF Round#11 --- 密码个人赛 wp

文章目录ez_encMyMessageMyGameez_signinez_facez_enc 题目&#xff1a; ABAABBBAABABAABBABABAABBABAAAABBABABABAAABAAABBAABBBBABBABBABBABABABAABBAABBABAAABBAABBBABABABAAAABBAAABABAABABBABBBABBAAABBBAABABAABBAAAABBBAAAABAABBBAABBABABAABABAAAAABBBBABAABBBBAAAAB…

开心档之开发入门网-C++ 变量类型

C 变量类型 目录 C 变量类型 C 中的变量定义 C 中的变量声明 实例 实例 C 中的左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小…

Java多线程:线程组

线程组 可以把线程归属到某一个线程组中&#xff0c;线程组中可以有线程对象&#xff0c;也可以有线程组&#xff0c;组中还可以有线程&#xff0c;这样的组织结构有点类似于树的形式&#xff0c;如图所示&#xff1a; 线程组的作用是&#xff1a;可以批量管理线程或线程组对象…

电脑清理怎么做?5个方法帮你解决电脑空间不足的问题!

案例&#xff1a;电脑清理怎么做&#xff1f; 【求一个电脑清理的好方法&#xff01;电脑垃圾文件太多了又不敢随意删除&#xff0c;怕误删重要的文件&#xff01;哪位友友可以帮我出出主意呀&#xff1f;到底应该怎么清理电脑呢&#xff1f;】 电脑使用的时间长了都会慢慢变…
最新文章