牛客小白月赛5 I 区间 (interval) 【前缀和】

链接:https://www.nowcoder.com/acm/contest/135/I

题目描述

    Apojacsleam喜欢数组。

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

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

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

    最后询问a[l]-a[r]内的元素之和?
    请认真看题干及输入描述。

输入描述:

输入共M+3行:

第一行两个数,n,M,意义如“题目描述”

第二行n个数,描述数组。

第3-M+2行,共M行,每行四个数,q,L,R,P,若q为1则表示执行操作2,否则为执行操作1

第4行,两个正整数l,r

输出描述:

一个正整数,为a[l]-a[r]内的元素之和
示例1

输入

复制
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5 5
1 2 3 6
0 2 5 5 
0 2 5 8
1 4 9 6
2 7

输出

复制
23

说明

 
思路:
 
使用 懒标记数组,标记询问操作,最后统一计算。
题目中问的 区间和 可以使用 For 从头加到尾,也可在统一处理标记数组的时候求 前缀和,然后  sum[r] - sum[l-1]
 
AC代码:
 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 const int MAXN=1000000+5;
 5 long long flag[MAXN];
 6 int ele[MAXN];
 7 int main(){
 8     int n,M;
 9     cin>>n>>M;
10     for(int i=1;i<=n;i++)
11         scanf("%d",&ele[i]);
12     int q,L,R,P;
13     for(int i=0;i<M;i++){
14         cin>>q>>L>>R>>P;
15         if(q==1){
16             flag[L]-=P;
17             flag[R+1]+=P;
18         }else{
19             flag[L]+=P;
20             flag[R+1]-=P;
21         }
22     }
23  
24  
25     int l,r;
26     cin>>l>>r;
27     long long ans=0;
28     long long tmp=0;
29     for(int i=1;i<=n;i++){
30         tmp+=flag[i];
31         ele[i]=ele[i]+tmp;
32     }
33      
34     for(int i=l;i<=r;i++)
35         ans+=ele[i];
36      
37  
38      
39     cout<<ans<<endl;
40     return 0;
41 }
原文地址:https://www.cnblogs.com/TianyuSu/p/9383106.html