IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 差分数组:PIPI的区间操作Ⅰ -> 正文阅读

[数据结构与算法]差分数组: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]);
        }
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:33:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码