【蓝桥备战】前缀和+差分+高精度

news2024/11/26 14:59:14

文章目录

  • 前缀和
  • 差分
  • 大整数加减乘除

前缀和

前缀和,即preSum[i] = nums[i-1] +nums[i-2] + ··· + nums[0]。一般地,我们会让preSum[0] = 0

图:preSum[3] = nums[2] + nums[1] + nums[0]。

构造前缀和数组对我们来说是简单的,只需要会用以下代码:

		int [] nums = {3,5,2,-2,4,1};
		//构建前缀和数组。
        preSum = new int [nums.length+1];
        //preSum[0]默认为0,从1开始放入前缀和。
        for(int i=1;i<preSum.length;i++){
            preSum[i]=preSum[i-1]+nums[i-1];
        }
    }

使用前缀和主要用来解决区域和的问题,如果想求出数组内left到right的和。就可以使用前缀和数组。

 public int sumRange(int left, int right) {
        return preSum[right+1] - preSum[left];
    }

  • 二维数组的前缀和

    我们需要定义一个前缀和数组 preSum [i][j]记录 matrix 中子矩阵 [0, 0, i - 1 , j - 1] 的元素和。同一维前缀和一样,一般我们会让preSum[0~i][0] = 0/preSum[0][0~j] = 0

    构造二维前缀和的模板如下:

    //构建二维前缀和
    private int [][]preSum;
    public NumMatrix(int[][] matrix) {
        int m=matrix.length;
        int n=matrix[0].length;
        preSum = new int [m+1] [n+1];
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                preSum [i][j] = preSum[i][j - 1] + preSum[i - 1][j] 
                -preSum[i-1][j-1] + matrix[i-1][j-1];
            }
        }
    }
    

    在这里插入图片描述
    图:构造二维前缀和

当然,如果想要求出matrix矩阵[row1,col1,row2,col2]区间的和,使用如下模板:

public int sumRegion(int row1, int col1, int row2, int col2) {
        return preSum[row2+1][col2+1]
        -preSum[row2+1][col1] - preSum[row1][col2+1] 
        + preSum[row1][col1];
    }

在这里插入图片描述

差分

差分数组,即遵循diff[i]=nums[i]-nums[i-1]的一个数组。

如果修改原数组left到right的值,不需要遍历,只是将 diff[left]+=datadiff[rght+1]-=data即可。

如果要将差分数组转换成原数组,则需要nums[i]=nums[i-1]+diff[i],也就是前缀和的做法。即前缀和与差分是互逆的。

public class Demo {
    private static final int [] nums = {1,2,6,7,9};
    //原数组构造差分数组
    public static int[] getDiff(int []nums){
        int [] diff = new int[nums.length];
        diff[0]=nums[0];
        //原数组—差分求法—差分数组
        for(int i=1;i<nums.length;i++){
            diff[i]=nums[i]-nums[i-1];
        }
        return diff;
    }
    //更改原数组的值(left到right)
    public static void increase(int left,int right,int []diff,int num){
        diff[left]+=num;
        if(right<diff.length - 1){
            diff[right+1]-=num;
        }
    }
    //差分数组构造原数组
    public static int [] getNums(int []diff){
        int nums1[]=new int [nums.length];
        nums1[0]=diff[0];
        //差分—前缀和求法—原数组
        for(int i=1;i< nums1.length;i++){
            nums1[i]=nums1[i-1]+diff[i];
        }
        return nums1;
    }
}

  • 二维差分数组
    关于二维差分数组的构建:
    我们可以先假想nums原数组为空,那么diff数组一开始也为空,但是实际上nums数组并不为空。因此我们每次让diff以(i,j)为左上角到以(i,j)为右下角面积内元素(其实就是一个小方格的面积)去插入 nums[i] [j],等价于原数组nums中(i,j) 到(i,j)范围内 加上了nums[i][j] ,因此执行n*m次插入操作,就成功构建了差分diff数组。

    如果要修改原数组[x1,y1,x2,y2]范围的值,只需要修改diff数组的四个位置,也就是insert函数。

    import java.util.Scanner;
    public class T798 {
    	static int n = 1001;
    	static int m = 1001;
    	static int N = 1001;
    	static int data;
    	static int [] [] diff = new int [N][N];
    	static int [] [] nums = new int [N][N];
    	static int [] [] ans =  new int [N][N];
    	//插入函数
    	static void insert(int x1,int y1,int x2,int y2,int c) {
    		diff[x1][y1] += c;
    		diff[x2 + 1][y1] -= c;
    		diff[x1][y2 + 1] -= c;
    		diff[x2 + 1][y2 + 1] += c;
    	}
    	public static void main(String[] args) {
    		Scanner s = new Scanner (System.in);
    		m = s.nextInt();
    		n = s.nextInt();
    		data = s.nextInt();
    		for(int i = 1;i<=m;i++) {
    			for(int j = 1;j <= n;j++) {
    				nums[i][j] = s.nextInt();
    			}
    		}
    		//构建二维差分数组。
    		for(int i = 1;i<= m;i++) {
    			for(int j = 1;j<= n;j++) {
    				insert(i,j,i,j,nums[i][j]);
    			}
    		}
    		while( data-- != 0) {
    			int row1 = s.nextInt() ;
    			int col1 = s.nextInt() ;
    			int row2 = s.nextInt() ;
    			int col2 = s.nextInt() ;
    			int add = s.nextInt();
    			insert(row1,col1,row2,col2,add);
    		}
    		//二维差分转为原数组——就是求差分数组的前缀和。
    		for(int i = 1;i<=m;i++) {
    			for(int j = 1;j<=n;j++) {
    				ans[i][j] = ans[i - 1][j] + ans[i][j - 1]  - ans[i - 1][j - 1] + diff[i][j];
    				System.out.print(ans[i][j] +" ");
    			}
    			System.out.println();
    		}
    	}
    	
    }
    
    

    在这里插入图片描述
    图:修改二维差分数组的值,对原数组的影响。

大整数加减乘除

在Java中有两个类BigIntegerBigDecimal分别表示大整数类和大浮点数类

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner (System.in);
		BigInteger n1 = s.nextBigInteger();
		BigInteger n2 = s.nextBigInteger();
		//加法
		System.out.println(n1.add(n2));
		//减法
		System.out.println(n1.subtract(n2));
		//乘法
		System.out.println(n1.multiply(n2));
		//除法
		System.out.println(n1.divide(n2));
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++中的内存分区模型

内存分区模型 c程序在执行时&#xff0c;将内存大方向划分为4个区域1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理2、全局区&#xff1a;存放全局变量和静态变量以及常量3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&…

手把手教你使用Vue3指定状态管理库--Pinia

什么是 Pinia Pinia 与 Vuex 一样&#xff0c;是作为 Vue 的“状态存储库”&#xff0c;用来实现 跨页面/组件 形式的数据状态共享。 在平时的开发过程中&#xff0c;Vue 组件之间可以通过 Props 和 Events 实现组件之间的消息传递&#xff0c;对于跨层级的组件也可以通过 Ev…

Java并发编程实战读书笔记三

第七章 取消和关闭 Java没有提供任何机制来安全的终止线程&#xff0c;虽然 Thread.stop 和 suspend 等方法提供了这样的机制&#xff0c;但由于存在着一些严重的陷&#xff0c;因此应该避免使用 7.1任务取消 7.1.1 中断 取消任务中生产者使用了队列的put操作导致阻塞后任务…

day14_类中成员之构造器

由来 我们发现我们new完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻烦了。我们能不能在new对象时&#xff0c;直接为当前对象的某个或所有成员变量直接赋值呢。可以&#xff0c;Java给我们提…

工作两年,没想到靠Python搞副业让我实现了财务自由

前言 国庆假期和好友聚会&#xff0c;聊了各自近两年的变化&#xff0c;朋友的经历让我大吃一惊&#xff01; 2年前他还是月薪5千的小编&#xff0c;现在轻松实现月入5万的小目标。 &#xff08;文末送读者福利&#xff09; 原来是利用空余时间学会了Python编程&#xff0c…

TPM零知识学习二—— 相关链接和页面

TPM2社区的主页地址为&#xff1a;https://tpm2-software.github.io/ 页面如下&#xff1a; 主页中提供了很多有用的链接&#xff0c;包括&#xff1a; Software | tpm2-software community 页面如下&#xff1a; External | tpm2-software community 页面如下&#xff1a;…

《计算机体系结构量化研究方法》1.8 性能的测量、报告和汇总

引入 1、一些概念 响应时间&#xff1a;手机用户所关注的“速度”&#xff0c;也就是一个事件从启动到完成的时间&#xff0c;又称为执行时间。 吞吐量&#xff1a;给定时间内完成的总工作量&#xff0c;WSC的操作人员关注这个。 执行时间是性能的倒数&#xff08;即执行时间…

DSP之Controlsuit和C2000Ware下载安装

DSP之Controlsuit和C2000Ware下载安装 Controlsuit 用于 C2000TM 微处理器的 controlSUITETM 是一套全面的软件基础设施和软件工具集&#xff0c;旨在最大程度地缩短软件开发时间。从特定于器件的驱动程序和支持软件到复杂系统应用中的完整系统示例&#xff0c;controlSUITET…

Redis击穿、穿透、雪崩

Redis 的基本概念 在没有添加 Redis 的时候&#xff0c;后端的查询流程是&#xff1a; 用户访问页面-请求后端服务-经过逻辑处理后&#xff0c;去数据库查询信息。 在添加 Redis 的之后&#xff0c;后端的查询流程是&#xff1a; 用户访问页面-请求后端服务-经过逻辑处理后&a…

超强AI绘图-文生图

一、前言 前面汇总了四种AI绘图的方法&#xff0c;详情可以点击下图跳转到文章《AI绘画合集&#xff08;11月汇总&#xff09;》。主要内容是&#xff1a;具象意象派AI作图、AI绘制专属动漫头像、基于ViLG模型AI 作画。点击下面文章跳转&#xff01; 《AI绘图—对中文拟合度…

LabVIEW创建类 3

LabVIEW创建类 3 继承 通过“继承”可在现有类的基础上创建新类。若创建一个新的LabVIEW类并将它设置为继承另一个类的数据及成员VI&#xff0c;这个新类将可使用它所继承的类中“公共”及“保护”型的成员VI。这个新类还可添加自己的数据和成员VI以丰富其功能。例如&#xf…

聚观早报 | 脸书泄露数据被罚20亿;iPhone15将全系支持灵动岛

今日要闻&#xff1a;脸书泄露数据被罚20亿&#xff1b;iPhone15将全系支持灵动岛&#xff1b;540万推特用户数据被盗&#xff1b;罗永浩入局tiktok&#xff1b;特斯拉研发改款Model3脸书泄露数据被罚20亿 据报道&#xff0c;脸书因泄露5亿用户数据&#xff0c;被欧洲监管机构罚…

Starday为什么是跨境电商卖家的不二之选?

据国内海关统计显示&#xff0c;近5年来&#xff0c;中国跨境电商规模增长近10倍&#xff0c;年增长率在30%以上&#xff0c;占国际贸易近40%。基于流量模式的跨境电商直播、垂直跨境电商等新模式蓬勃发展&#xff0c;近几年跨境电商一直不断地在深度融合发展&#xff0c;加之疫…

WSL Ubuntu20.04安装pycairo指南

环境说明 wsl Ubuntu20.04 走过的一些可能有用的弯路 由于pycairo要求python3.7&#xff0c;但是之前Ubuntu上有个3.6的python环境&#xff0c;所以就安装了python3.8&#xff1a; sudo apt install python3.8然后python3命令还是链接到python3.6&#xff0c;结果就yongln …

Stateflow状态转移练习

文章目录1.外部转移与内部转移1.1 stateflow1.2 分析2.外部转移内部转移超转移2.1 stateflow2.2 video1.外部转移与内部转移 1.1 stateflow 1.2 分析 首先是 xyz0&#xff0c;然后进入 A 状态&#xff0c;此时 A 的 en 激活&#xff0c;xx1&#xff0c;即 x1其次进入默认状态…

聊天软件im即时通讯源码酷信视酷,在线语音视屏通话端对端加密聊天,支持7端互通带部署教程

APP端有安卓端苹果端&#xff0c;PC端&#xff0c;web端&#xff0c;管理端有PC后台&#xff01; .产品为独立开发&#xff0c;非网上下载不能用的产品&#xff01; .高端产品&#xff0c;即时聊天软件技术难度大&#xff0c;请不要拿网络其他聊天软件来对比&#xff0…

多线程,了解-概念-实现方式-常见方法-安全问题-死锁-生产者消费者

了解 简单了解多线程 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 简单了解多线程 简单了解多线程 简单了解多线程 简单了解多线程 概念 线程相关的概念 并行&#xff1a;在同…

【Linux进阶】-- 1.python脚本实现守护进程daemon调度,启停等

"怀斯曼不蒸汽啊"1. Linux守护进程介绍1.1 查看进程2. python指令for linux2.1 运行shell命令3. 代码讲解3.1 创建守护进程文件pre_deal.py3.2 用脚本运行3.3 用一个python程序来管理该任务任务介绍: 首先python创建文件1,作用是创建一个守护进程,内容是持续输出时间…

<C++>手撕搜索二叉树

目录 一、搜索二叉树的性质 二、搜索二叉树的结构定义 三、手撕搜索二叉树非递归 1&#xff09;Insert() 2&#xff09;Find() 3&#xff09;Erase() 4&#xff09;InOder() 5&#xff09;BSTree(const BSTree& t) 拷贝构造 6&#xff09;~BSTree()析构函数 四、手…

【学习笔记65】JavaScript的继承

一、认识继承 function Person(name) {this.name name}Person.prototype.sayName () > {console.log(name)}function Stu(age) {this.age age}const s new Stu(18)console.log(s) // {age: 18} 说明&#xff1a; 想让s这个对象内部有一个name属性, 并且可以使用 sayN…