一维差分模板

题目链接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,lrx,表示一个操作。

输出

   共一行,包含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 */

猜你喜欢

转载自www.cnblogs.com/ZKYAAA/p/12935030.html
今日推荐