码迷,mamicode.com
首页 > 其他好文 > 详细

前缀和与差分

时间:2019-04-20 12:55:39      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:pac   log   main   article   ++   链接   树状   code   stdin   

学习链接

[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;
}

前缀和与差分

标签:pac   log   main   article   ++   链接   树状   code   stdin   

原文地址:https://www.cnblogs.com/mch5201314/p/10740492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!