牛客小白月赛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
说明
思路:
使用 懒标记数组,标记询问操作,最后统一计算。
题目中问的 区间和 可以使用 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 }