牛客小白月赛5 I-区间【前缀和

链接: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

 

#include "bits/stdc++.h"
#define maxx 1000005
using namespace std;
long long  a[maxx]={0},sum[maxx]={0};
int main(){
    long long n,m,q,L,R,p,l,r,sum1;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    while(m--){
        cin>>q>>L>>R>>p;
        if(q==1){
            sum[L]-=p;
            sum[R+1]+=p;
        }
        else{
            sum[L]+=p;
            sum[R+1]-=p;
        }
    }
    cin>>l>>r;
    for(int i=1;i<=n;i++){
        sum[i]=sum[i]+sum[i-1];
        a[i]=a[i]+sum[i]+a[i-1];
    }
    cout<<a[r]-a[l-1]<<endl;
    return 0;
}

前缀和求解O(1)

求和:在一个数组中,我们用sum[k]表示前k个数的和,那么sum[k]=sum[k-1]+ak。[L,R]内的范围和就为sum[R]-sum[L-1];

区间修改:设置一个change数组,当区间[i,j]上要加k时,我们令change[i]+=k;令change[j+1]-=k;如果我们对change数组求前缀和的话,前缀和sum_change[i]就是i这个位置变动的值。

 

二维前缀和:

sum[o][j]=sum[i][0]=0;

a[x1~x2][y1~y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值