算法学习——差分

在了解差分之前,我们首先需要知道前缀和的概念。

前缀和简单介绍:

对于一个数组A,要求出A[0]~A[i]的和,我们通常的做法是遍历一边,加起来。但是要求m组这样的和,我们就要花费O(mn)的时间复杂度。显然不合理。所以我们要用到动态规划里的备忘录思想,创建一个新数组B,B[i]记录的是B[0]~B[i]的和。这个数组就是A的前缀和。

差分的概念:

有前缀和就有其逆定理。那就是假设数组A是一个前缀和数组,那么怎么求原数组呢B?答案是B[i] = A[i] - A[i-1] 这很好理解。这种算法可以被视为前缀和的逆运算

现在我们获得了差分的概念,让我们看看怎么使用它吧。

如何使用:

差分主要用处在于:

快速将序列A[l..r]的区间每个元素加上d。

正常加我们就需要不断遍历这一段数组。但是我们有了差分的概念,因此我们可以得到差分数组B[l]' = A[l] + d - A[l-1] = B[l] + d

B[r+1]' = A[r+1] -A[r] -d = B[r+1] - d

差分可以将在原序列上的 “区间操作” 转化为差分序列上的 “单点操作”

现在有了对一维数组的差分运算, 我们可以看看二维数组怎么操作。

二维差分:

二维差分要解决的问题是给原二维数组A的[x1,y1]~[x2,y2]处的所有元素加上d。

我们根据几何关系可以得出以下公式

Bi,j = Ai,j - Ai-1,j - Ai,j-1, + Ai-1,j-1

结合前面文章中差分的用途,可以容易的想到,二维差分主要是用于快速将一个区块中的所有元素加上 d

根据我们的公式我们很快得出一个结论:

对原数组A的[x1,y1]~[x2,y2]处的所有元素加上d等价于:

B[x1,y1] += 1

B[x1,y2+1] -= 1

B[x2+1,y1] -= 1

B[x2+1,y2+1] += 1

可以画一张图自己看看,推导很简单

应用:

问题描述

小兰拥有n*n 大小的棋盘,一开始棋盘上全是白子,小兰进行了m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。

输入格式

输入的第一行包含两个整数 n,m,用一个空格分隔,表示棋盘大小与操作数。

接下来 m 行每行包含四个整数 x1,y1,x2,y2,相邻整数之间使用一个空格分隔,表示将在 x1~x1行,y1~y2 列中的棋子颜色取反。

输出格式

输出 n 行,每行 n 个 0 或  1 表示该位置棋子的颜色。如果是白色则输出 0,否则1

样例输入
3 3
1 1 2 2
2 2 3 3
1 1 3 3
样例输出
001
010
100

代码:

import java.util.Scanner;public class Main extends Base{public static void main(String[] args) {int n = I(),m = I();int[][] sum = new int[n+1][n+1]; //原数组int[][] diff = new int[n+2][n+2]; //差分数组for(int k=0;k<m;k++){int x1 = I(),y1 = I(),x2 = I(),y2 = I();//每次对差分数组4个位置操作diff[x1][y1]++;diff[x1][y2+1]--;diff[x2+1][y1]--;diff[x2+1][y2+1]++;}//由差分数组得到原数组for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){sum[i][j] = sum[i-1][j]+sum[i][j-1]+diff[i][j]-sum[i-1][j-1];if(sum[i][j]%2==0) print(0);else print(1);}print("\n");}}
}
class Base {static Scanner scan = new Scanner(System.in);static int I(){return scan.nextInt();}static <T> void println(T x){System.out.println(x);}static <T> void print(T x){System.out.print(x);}
}
sum[i][j] = sum[i-1][j]+sum[i][j-1]+diff[i][j]-sum[i-1][j-1];

这一行是 

Bi,j = Ai,j - Ai-1,j - Ai,j-1, + Ai-1,j-1求Ai,j的运算变形

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

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

相关文章

【考研数学】汤家凤1800题什么水平?

我觉得汤家凤基础武忠祥强化这个组合非常的不错 汤家凤老师的讲课风格 汤家凤老师的基础课程是大家公认的讲的详细&#xff0c;并且非常照顾基础不好的学生&#xff0c;会把基础知识点掰开揉碎的讲给大家听&#xff0c;在上课过程中&#xff0c;还会把知识点写在A4纸上&#…

试了下新型的360AI搜索

360AI搜索 试了下&#xff0c;感觉还是挺不错的。 比如问这个问题&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 对于ERROR 1698 (28000): Access denied for user rootlocalhost的问题&#xff0c;这通常是由于MySQL密码为…

【Javascript】设计模式之单例模式

文章目录 1、实现单例模式2、透明的单例模式3、用代理实现单例模式4、JavaScript 中的单例模式5、惰性单例6、通用的惰性单例7、小结 定义&#xff1a; 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点 单例模式是一种常用的模式&#xff0c;有一些对象我们往…

JavaScript 学习总结(16)—— 实用小函数总结

1.匹配正整数 // 匹配正整数 let isPositiveNum = val => {return /^[1-9]d*$/.test(val); }; console.log(isPositiveNum(9)) //true console.log(isPositiveNum(2.2)) //false 2.匹配负整数 // 匹配负整数let isNegativeNum = val => {return /^-[1-9]d*$/.test(val…

R750 install AMD MI210GPU

一、 查看服务器GPU卡信息 可以首先在服务器上check 当前GPU的详细信息是否匹配 二、安装 Ubuntu22.04操作系统 服务器CHECK 安装的AMD GPU 是否被系统识别 #lspci | grep AMD 查看GPU信息 可以看到已经识别成功 三、安装AMD GPU驱动 https://rocm.docs.amd.com/projec…

linux 根目录下结构

/ 虚拟目录的根的目录&#xff0c;通常不会在这里放置文件 /bin&#xff1a;存放频繁使用的命令,二进制文件&#xff0c;存放了很多用户级的GNU实用工具。 /boot&#xff1a;引导目录&#xff0c;存放引导文件&#xff0c;包含启动Linux所需的核心文件。 /dev&#xff1a;设…

智能驾驶规划控制理论学习05-车辆运动学规划案例分析

目录 案例一——Hybrid A*&#xff08;基于正向运动学&#xff09; 1、基本思想 2、 实现流程 3、启发函数设计 4、分析扩张&#xff08;Analytic Expansions&#xff09; 5、分级规划&#xff08;Hierarchical planning&#xff09; 案例二——State Lattice Planning&…

子矩阵的和 刷题笔记 {二维前缀和}

首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去 最后加上a[i][j]即可完成目标 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看题目要求 要求x1,y1,x2,y2围成的小正方形内的元素和…

C/C++工程师面试题(数据库篇)

索引的优缺点 索引是一种支持快速查找特定行的数据结构&#xff0c;如果没有索引&#xff0c;就需要遍历整个表进行查找。用于提高数据检索的速度和效率。 好处&#xff1a; 提高检索速度&#xff1a; 索引可以加快数据的检索速度&#xff0c;因为它们允许数据库系统直接定位到…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法,这种方法通常只在平面视图中适用,在三维视图中也是无法创建的(目前研究的是这样的,如果有其他方法,请赐教)。 本片文章介绍一个下在立面视图中创建FilledRegion的方法,主要操作是在立面视图中拾取一个点,然后以该点为原点,…

YOLOv5 项目:推理代码和参数详细介绍(detect)

1、前言 本章将介绍yolov5项目的推理函数&#xff0c;关于yolov5的下载和配置环境&#xff0c;参考上一篇文章&#xff1a; YOLOv5 项目&#xff1a;环境配置-CSDN博客 pycharm 中打开的推理模块如红框中所示 pycharm将conda新建的虚拟环境导入&#xff0c;参考 &#xff1a;…

快速模幂(c++题解)

题目描述 试求ab%n的值&#xff0c;其中a、b、n均为整数范围内的数。 输入格式 三个整数即a、b、n。 输出格式 输出结果。 样例 样例输入 复制1 1 1样例输出 复制0 _____________________________________________________________________________ ok呀总算学到一个…

从 AI 的爆火聊聊用户界面(UI)的演进

目录 用户界面的起源与发展 用户界面的设计原则与趋势 用户界面未来的方向 小结 用户界面&#xff08;User Interface&#xff0c;简称 UI&#xff09;是人与计算机系统交互的媒介&#xff0c;用户可以通过用户界面向计算机发送指令&#xff0c;同时计算机可以通过用户界面…

面试 Java 基础八股文十问十答第十五期

面试 Java 基础八股文十问十答第十五期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;BIO, NIO, AIO 有什么…

简单实现Transformer的自注意力

简单实现Transformer的自注意力 关注{晓理紫|小李子}&#xff0c;获取技术推送信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我。 源码获取&#xff1a;VX关注并回复chatg…

二叉树的右视图,力扣

目录 题目&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现(DFS)&#xff1a; 代码1&#xff1a; 补充说明&#xff1a; 代码2&#xff1…

Vue.js中的$nextTick

其实目前在我现有的开发经历中&#xff0c;我还没有实际运用过$nextTick&#xff0c;今天在看书时&#xff0c;学习到了这个东西&#xff0c;所以做个笔记记录一下。 一、$nextTick是什么&#xff1f; $nextTick 是 Vue提供的一个方法&#xff0c;用于在 DOM 更新之后执行回调…

AI:148-开发一种智能语音助手,能够理解和执行复杂任务

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

浅谈钩子方法

何为钩子方法 钩子方法&#xff08;Hook methods&#xff09;是一种在面向对象编程中常用的设计模式&#xff0c;也被称为模板方法模式。在这种模式中&#xff0c;父类定义了一个算法的框架&#xff0c;并且将一些步骤的实现延迟到子类中。子类可以通过重写这些“钩子方法”来改…

[技巧]Arcgis之图斑四至点批量计算

前言 上一篇介绍了arcgis之图斑四至范围计算&#xff0c;这里介绍的图斑四至点的计算及获取&#xff0c;两者之间还是有差异的。 [技巧]Arcgis之图斑四至范围计算 这里说的四至点指的是图斑最东、最西、最南、最北的四个地理位置点坐标&#xff0c;如下图&#xff1a; 四至点…