一维前缀和更新与维护

现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:

        操作一:将a[L]-a[R]内的元素都加上P

        操作二:将a[L]-a[R]内的元素都减去P

    最后询问a[l]-a[r]内的元素之和?
n,m <= 1e6
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 const int N = 1e6+10;
 8 int n,m;
 9 int a[N],b[N];
10 int main()
11 {
12     while(scanf("%d%d",&n,&m)!=EOF)
13     {
14         for(int i = 1; i <= n; i++)scanf("%d",&a[i]);
15         int t,l,r,p;
16 
17         while(m--)
18         {
19             scanf("%d%d%d%d",&t,&l,&r,&p);
20             if(t==1)
21             {
22                 b[l]-=p;
23                 b[r+1]+=p;
24             }
25             else
26             {
27                 b[l]+=p;
28                 b[r+1]-=p;
29             }
30         }
31         for(int i = 1; i <= n; i++)
32             b[i] += b[i-1];
33         scanf("%d%d",&l,&r);
34         long long sum = 0;
35         for(int i = l; i <= r; i++)
36             sum+=a[i]+b[i];
37         cout<<sum<<endl;
38     }
39     return 0;
40 }

 

posted @ 2018-07-27 21:08  TTTCoder  阅读(292)  评论(0编辑  收藏  举报