差分数组

差分

先说一道题目:
给出一个数组,m个操作每次操作从l到r位置的每个数加上z
最后给出q个查询,查询每次l到r位置的区间和

差分做法:

设d[i] = a[i]-a[i-1] (1<i≤n,d[1]=a[1]);
设f[i] = f[i-1]+d[i] (1<i≤n,f[1]=d[1]=a[1]);
设sum[i] = sum[i-1]+f[i] (1<i≤n,sum[1]=f[1]=d[1]=a[1])。

举个例子 求一下1-3的区间和
图片说明

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxx = 100010;
int n,m,q,l,r,z;
int a[maxx],d[maxx],f[maxx],sum[maxx];
int main()
{
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        d[i]=a[i]-a[i-1];
    }
    for(int i=1;i<=m;i++){
        cin>>l>>r>>z;
        d[l]+=z;
        d[r+1]-=z;
    }
    for(int i=1;i<=n;i++){
        f[i] = f[i-1]+d[i];
        sum[i]=sum[i-1]+f[i];
    }
    for(int i=1;i<=q;i++){
        cin>>l>>r;
        cout<<sum[r]-sim[l-1]<<endl;
    }
    return 0;
}
全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务