差分数组:PIPI的区间操作Ⅰ

文章目录

  • 差分数组:PIPI的区间操作Ⅰ
    • 差分数组
    • 问题:
    • 思路:
    • 代码:

差分数组

  差分数组其实就是对数组做差分,即前一项减去后一项,差分数组的定义为:对于有n个元素的数组a,差分数组b为数组a中每一项与前一项的差值。显然,b[1]=a[1]-0=a[1];对于整数i∈[2,n],则有b[i]=a[i]-a[i-1]。例子如下:

  我们不难发现,设sum数组为b数组的前缀和数组,那么sum数组的值和a数组的值是对应相等的,也就是说,相对于数组a的差分数组b来说,a数组就是其前缀和数组。这是差分数组的重要性质,差分数组的前缀和对应原数组,也就是我们可以将差分数组通过前缀和还原为原数组

  那么差分数组有什么作用呢?答案是快速处理区间加减操作。例如对区间[L,R]中的每个数加上x,我们通过差分数组的性质知道,第一个受影响的差分数组中的元素为b[L],因为a[L]加上了x,a[L - 1]没有加,所以令b[L]+=x;最后一个受影响的差分数组中的元素为b[R+1],因为a[R]加上了x,a[R + 1]没有加,所以令b[R+1]-=x。

  这样对于区间加减操作,我们不必对区间内每一个数进行处理,只需处理两个差分后的数即可。例如,我们要对a数组[2,3]区间的每个数加上3,再对a数组[3,4]区间的每个数加上1,求最终a数组的每个数是多少:

  差分数组特别适合解决多次区间加减操作,最后再询问的问题。例如,若需要对区间进行n次加减,最后求区间和,用for循环的时间复杂度为O(n ^ 2),而使用差分数组的时间复杂度为O(n)。

问题:


思路:

  差分数组板子题。我们对原数组a求差分数组b,那么对每个区间加操作,我们就令b[L]+=P并令b[R+1]-=P。如果是区间减操作,就令b[L]+=-P并令b[R+1]-=-P就行了。进行完m次操作后,我们对b数组求其前缀和数组,即可把它还原成经过m次操作后的a数组。然后再对a数组求前缀和sum数组,那么对接下来的q次询问,我们对每个问题输出sum[r]-sum[l-1]即可。

代码:

import java.util.*;public class Main {static long[] subArray = new long[100005];static long[] array = new long[100005];static long[] preSum = new long[100005];public static void main(String[] args) {int n, m, q, op, l, r, i;long p;Scanner scanner = new Scanner(System.in);n = scanner.nextInt();m = scanner.nextInt();q = scanner.nextInt();for (i = 0; i < n; i++) {array[i] = scanner.nextLong();}subArray[0] = array[0];for (i = 1; i < n; i++) {subArray[i] = array[i] - array[i - 1];}for (i = 0; i < m; i++) {op = scanner.nextInt();l = scanner.nextInt() - 1;r = scanner.nextInt() - 1;p = scanner.nextLong();if (op == 1) {subArray[l] += p;if (r + 1 < n) {subArray[r + 1] -= p;}} else {subArray[l] -= p;if (r + 1 < n) {subArray[r + 1] += p;}}}array[0] = subArray[0];for (i = 1; i < n; i++) {array[i] = array[i - 1] + subArray[i];}preSum[0] = array[0];for (i = 1; i < n; i++) {preSum[i] = preSum[i - 1] + array[i];}for (i = 0; i < q; i++) {l = scanner.nextInt() - 1;r = scanner.nextInt() - 1;System.out.println(l == 0 ? preSum[r] : preSum[r] - preSum[l - 1]);}}
}

差分数组:PIPI的区间操作Ⅰ相关推荐

  1. 线性结构 —— 差分数组

    [差分数组] 差分数组不仅仅是一个优秀的线性结构,还是一种很好的思想,其主要用于修改区间.查询单点,其中,修改区间的时间复杂度均为 O(1),查询单点的时间复杂度为 O(n) 对于已知有 n 个元素的 ...

  2. 树状数组(单点+区间的所有操作)

    转载:https://blog.csdn.net/I_believe_CWJ/article/details/80374326 更简洁方便的数据结构--树状数组(基于线段树的实现) 1.单点更新+区间 ...

  3. LeetCode 1674. 使数组互补的最少操作次数(差分思想)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...

  4. 【POJ - 3468 】 A Simple Problem with Integers (线段树模板 区间更新 + 区间和查询)(不能树状数组或差分数组)

    题干: You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type o ...

  5. C - 思考使用差分简化区间操作

    FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positi ...

  6. 蓝桥杯 算法提高 分苹果 【差分数组 + 离线区间加 + 板子题】

    [算法提高 分苹果] (http://lx.lanqiao.cn/problem.page?gpid=T345) 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹 ...

  7. Gym 101775J Straight Master(差分数组)题解

    题意:给你n个高度,再给你1~n每种高度的数量,已知高度连续的3~5个能消去,问你所给的情况能否全部消去:例:n = 4,给出序列1 2 2 1表示高度1的1个,高度2的2个,高度3的2个,高度4的1 ...

  8. 差分数组 and 树上差分

    差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...

  9. Gym - 101775J Straight Master(差分数组)

    题目链接:点击查看 题目大意:给出n种数,每种数有a[i]个,每3-5种连续的数都可以被消去,现在问给出的所有数字最后能否全部消去 题目分析:正难则反,题目问能否将数字全部消去,我们不妨设一开始的起点 ...

  10. Master of GCD(差分数组||线段树)

    题意:长度为n的数组,一开始都是1.对于区间操作l,r,x,在l~r上乘以x.x2||x3.问操作完毕之后,n个数的最大公因子是多少. 对于每个x,都等于2或者是3.那么看最大的公因子,就看各个位置上 ...

最新文章

  1. web类协议脚本-飞机订票系统示例
  2. python入门代码示例-Python入门100个实例(14)——换行符和制表符
  3. 数据结构与算法JavaScript描述——链表
  4. VS2010 IDE新特性随笔
  5. x264中I,P,B帧和PTS,DTS的关系
  6. 解决问题 “You don‘t have permission to access /index.html on this server.”
  7. python菜鸟教程100例-Python 练习实例1
  8. 之前出的一道背包题面,暂无题解
  9. 炒菜机器人煎鸡蛋视频_还在用油炒鸡蛋?赶紧试试用“它”炒,鸡蛋滑嫩还不粘锅!大厨轻易不透露...
  10. 蔬菜大棚原理_温室大棚的原理是什么?
  11. 转 VSS 2005 使用详解
  12. python将excel数据批量导入sqlserver数据库
  13. 【毕业设计/Matlab系列】基于matlab的线性调频信号的仿真
  14. Java web学生信息管理系统(jsp)
  15. AE Dulik骨骼绑定脚本!
  16. matlab给定振形用图表示,基于 MATLAB 的简谐振动合成图形的动态演示
  17. 赚任务网APP下载站源码/任务网源码/积分墙/网络任务网站源码
  18. 2021年上半年最接地气的Android面经,隔壁都馋哭了
  19. 二维码解码程序的两大难点问题
  20. java 通过SSL/TLS加密https建立连接

热门文章

  1. 专访北京中医药大学副教授郭凤英:产学合作,为新医科培养复合型人才
  2. javaweb response
  3. java文字格斗游戏
  4. liferay-protal学习1-配置开发环境
  5. 在C语言中对于整形变量采用有符号数,C语言编程(张欣 机制192-3)-中国大学mooc-题库零氪...
  6. 动画制作后期那点事——调色
  7. P1567 统计天数【入门】
  8. 记录下如何判断错误:no such file or directory
  9. uniapp 电商小程序 订单30分钟倒计时
  10. 机器算法基础——回归分析