前缀和与差分

 

差分 思想:

通过原始数组a,构造差分数组b。由下面两个函数构成:

//差分数组的插入函数
public void insert(int l,int r,int c) {
    b[l] += c;
    b[r+1] -= c;
}

 

//a数组
for(int i = 1;i <= n;i ++) {
    a[i] = sc.nextInt();
}

//构造差分数组b
for(int i = 1;i <= n;i ++) {
    insert(i, i, a[i]);
}

可以得知:原数组a 是 差分数组 b 的前缀和。

ai = b1 + b2 + ... + bi

 

输入一个长度为 n 的整数序列。

接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。

请你输出进行完所有操作后的序列。

输入格式
第一行包含两个整数 n 和 m。

第二行包含 n 个整数,表示整数序列。

接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。

输出格式
共一行,包含 n 个整数,表示最终序列。

数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
import java.io.*;
import java.util.*;

public class Main{
    public static int N = (int)1e6 + 10;
    public static int[] a = new int[N]; //原始数组,是差分数组b的前缀和
    public static int[] b = new int[N]; //差分数组
    
    //差分数组插入函数
    public static void insert(int l, int r, int c) {
        b[l] += c;
        b[r+1] -= c;
    }
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] arrs1 = br.readLine().split(" ");
        int n = Integer.valueOf(arrs1[0]).intValue();
        int m = Integer.valueOf(arrs1[1]).intValue();
        
        String[] arrs2 = br.readLine().split(" ");
        //前缀和下标从1开始,方便
        for(int i = 1;i <= n;i ++) a[i] = Integer.parseInt(arrs2[i-1]);
        
        //构造差分数组b
        for(int i = 1;i <= n;i ++) {
            insert(i, i, a[i]); 
        }
        
        while(m -- > 0) {
            String[] arrs3 = br.readLine().split(" ");
            int l = Integer.parseInt(arrs3[0]);
            int r = Integer.parseInt(arrs3[1]);
            int c = Integer.parseInt(arrs3[2]);
            
            insert(l, r, c);
        }
        
        //求原数组a插入元素后的值结果,相当于求差分数组b的前缀和a
        for(int i = 1;i <= n;i ++) {
            a[i] = a[i-1] + b[i]; 
        }
        
        for(int i = 1;i <= n;i ++) System.out.print(a[i] + " ");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值