一维差分模板
题目链接:http://oj.hzjingma.com/p/40?view=classic
题目大意:
输入一个长度为nn的整数序列。
接下来输入qq次操作,每个操作包含三个整数l, r, xl,r,x,表示将序列中[l, r][l,r]之间的每个数加上xx。
请你输出进行完所有操作后的序列。
输入
第一行包含两个整数nn和qq。
第二行包含nn个整数,表示整数序列。
接下来qq行,每行包含三个整数l,r,x,l,r,x,表示一个操作。
输出
共一行,包含nn个整数,表示最终序列。
样例
输入
6 3
1 2 3 4 5 6
1 6 1
1 1 2
2 2 -3
输出
4 0 4 5 6 7
1 /* 2 * @Descripttion: 3 * @version: 4 * @Author: ZKYAAA 5 * @Date: 2020-05-18 21:08:58 6 * @LastEditors: 请叫我ZK谕啊啊啊 7 * @LastEditTime: 2020-05-22 08:24:37 8 * 6 3 9 * 1 2 3 4 5 6 10 * 1 6 1 11 * 1 1 2 12 * 2 2 -3 13 * 分析:l+1到r区间加一个常数,端点单点修改值 14 * 初始状态的差分数组sum[i]为 1,1,1,1,1,1 15 * 第一次操作 1 6 1,就是sum[1]=sum[1]+1,sum[7]=sum[7]-1;sum[i]变为 2,1,1,1,1,1; 16 * 第二次操作 1 1 2,就是sum[1]=sum[1]+2,sum[2]=sum[2]-2;sum[i]变为 4,-1,1,1,1,1; 17 * 第三次操作 2 2 -3,就是sum[2]=sum[2]-3,sum[3]=sum[3]+3;sum[i]变为 4,-4,4,1,1,1; 18 * 输出数据:a[1]=sum[0]+sum[1]=4; 19 * a[2]=sum[0]+sum[1]+sum[2]=0; 20 * a[3]=sum[0]+sum[1]+sum[2]+sum[3]=4; 21 * a[4]=sum[0]+sum[1]+sum[2]+sum[3]+sum[4]=5; 22 * a[5]=sum[0]+sum[1]+sum[2]+sum[3]+sum[4]+sum[5]= 6; 23 * a[6]=sum[0]+sum[1]+sum[2]+sum[3]+sum[4]+sum[5]+sum[6]= 7; 24 * 输出:4,0,4,5,6,7 25 */ 26 27 #include <bits/stdc++.h> 28 using namespace std; 29 const int MAXN=100010; 30 long long a[MAXN]; 31 long long f[MAXN]; 32 long long sum[MAXN]; 33 int main(){ 34 int n,q,l,r,x; 35 memset(f,0,sizeof(f)); //初始化 36 memset(sum,0,sizeof(sum)); //初始化 37 scanf("%d %d",&n,&q); 38 for(int i=1;i<=n;i++){ 39 scanf("%lld",&a[i]); 40 } 41 for(int i=1;i<=q;i++){ 42 scanf("%d %d %d",&l,&r,&x); 43 f[l]+=x; //区间左端点位置+x 44 f[r+1]-=x; //区间右端点+1位置-x 45 } 46 for(int i=1;i<=n;i++){ 47 sum[i]=sum[i-1]+f[i]; //计算前缀和 48 } 49 for(int i=1;i<=n;i++) 50 printf("%lld ",a[i]+sum[i]); 51 } 52 return 0; 53 } 54 /* 55 ***Acwing题解:https://www.acwing.com/problem/content/description/799/ 56 57 #include<iostream> 58 #include<vector> 59 using namespace std; 60 vector<int> s(100010,0),b(100010,0); 61 int main(){ 62 int n,m; 63 cin>>n>>m; 64 for(int i=1;i<=n;i++) cin>>s[i];//存放原数组 65 // for(int i=1;i<=n;i++) cout<<s[i]<<' '; 66 // cout<<endl; 67 68 for(int i=1;i<=n;i++) b[i] = s[i]-s[i-1];//构造差分数组 69 // for(int i=1;i<=n;i++) cout<<b[i]<<' '; 70 // cout<<endl; 71 while(m--){ 72 int l,r,c; 73 cin>>l>>r>>c; 74 b[l]+=c;//将l和以后加c 75 b[r+1]-=c;//将r之后-c 76 } 77 // for(int i=1;i<=n;i++) cout<<b[i]<<' '; 78 // cout<<endl; 79 for(int i=1;i<=n;i++){ 80 b[i]=b[i-1]+b[i];//将差分改为原数组 81 cout<<b[i]<<' '; 82 } 83 return 0; 84 } 85 */