输入一个长度为n的整数序列。
接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,表示整数序列。
接下来m行,每行包含三个整数l,r,c,表示一个操作。
输出格式
共一行,包含n个整数,表示最终序列。
数据范围
1≤n,m≤1000001≤n,m≤100000,
1≤l≤r≤n1≤l≤r≤n,
−1000≤c≤1000−1000≤c≤1000,
−1000≤整数序列中元素的值≤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
思路:给定原数组a[1],a[2],...a[n],构造差分数组b[N],使得a[i] = b[1] + b[2]+ ...b[i],一般假定初始全为0,用insert(i, i, a[i])即可构造出b[N]
核心操作:将a[L~R]全部加上C,等价于:b[L] += C, b[R + 1] -= C
代码:
import java.util.Scanner; public class Main { static final int max=100005; static int a[]=new int[max]; static int b[]=new int[max]; public static void insert(int l,int r,int c){ b[l]+=c; b[r+1]-=c; } public static void main(String[] args) { Scanner scan=new Scanner(System.in); int n=scan.nextInt(); int m=scan.nextInt(); for(int i=1;i<=n;i++) a[i]=scan.nextInt(); for(int i=1;i<=n;i++) insert(i,i,a[i]);//差分数组初始化 while(m-->0){//更新操作 int l=scan.nextInt(); int r=scan.nextInt(); int c=scan.nextInt(); insert(l,r,c); } for(int i=1;i<=n;i++) b[i]+=b[i-1];//差分数组求前缀和 for(int i=1;i<=n;i++) System.out.print(b[i]+" ");//输出更新后的数组 } }
实例理解:
初始化:
对于数组b[] ,当a数组为1,2,3,4,5
b[1]+1 b[2]-1
b[2]+2 b[3]-2
b[3]+3 b[4]-3
b[4]+4 b[5]-4
b[5]+5 b[6]-5
+操作:比如对区间[3,4]加5,b[3]+5 b[5]-5