前缀和与差分

时间:2019-04-20
本文章向大家介绍前缀和与差分,主要包括前缀和与差分使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

学习链接

[https://blog.csdn.net/k_r_forever/article/details/81775899]
这个地方说的很好了。
前缀和和差分很重要
在树状数组和线段树都会用到

一维

#include<bits/stdc++.h>
using namespace std;
const int N=1000+10;
int f[N],t[N];

int main()
{
    int n,m,l,r,x,q;
    //freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>f[i];
    cin>>m;
    for(int i=0;i<m;i++)
    {
        cin>>l>>r>>x;
        t[l]+=x,t[r+1]-=x;
    }
    cin>>q;
    int add=0;
    for(int i=1;i<=n;i++)
    {   add+=t[i];
        f[i]+=f[i-1]+add; 
     } 
     for(int i=0;i<q;i++){
        cin>>l>>r;
        cout<<f[r]-f[l-1]<<endl;
     }
    return 0;
}

二维

#include<bits/stdc++.h>
using namespace std;
const int N=1000+10;
int f[N],t[N];
int a[N][N],b[N][N];

int main()
{
    int n,m,x,x1,y1,x2,y2,q;
    freopen("in.txt","r",stdin);
     cin>>n>>m>>q; 
     for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
     cin>>a[i][j];
     for(int i=0;i<m;i++)
     {
        cin>>x1>>y1>>x2>>y2>>x;
        b[x1][y1]+=x,b[x2+1][y1]-=x,b[x1][y2+1]-=x,b[x2+1][y2+1]+=x;
     }
     for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
        b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
     
     for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
        a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j];
     
     for(int i=0;i<q;i++){
        cin>>x1>>y1>>x2>>y2;
        int ans=a[x2][y2]-a[x2][y1-1]-a[x1-1][y2]+a[x1-1][y1-1];
        cout<<ans<<endl;
     }
    return 0;
}