zbyQIN

 

差分(一维与二维)与等差数列问题

利用差分的思想解决 多次对数组区间加相同数,或者加一个等差数列

最好思路:从目标数列往前推两次前缀和,反推差分数组应该怎么加

 

 

#include<bits/stdc++.h>
#define int long long
using namespace std;


int n,m,l,r,s,e,d,maxv,ans;
int a[10000005],sum[10000005];


signed main()
{
    
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&l,&r,&s,&e);
        d=(e-s)/(r-l);
        a[l]+=s;
        a[l+1]+=d-s;
        a[r+1]-=(d+e);
        a[r+2]+=e;
        
    }
    
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
    
    for(int i=1;i<=n;i++)sum[i]+=sum[i-1];
    
    
    for(int i=1;i<=n;i++)
    {
        maxv=max(maxv,sum[i]);
        ans^=sum[i];
    }
    
    cout<<ans<<' '<<maxv;
    
    return 0;
}
    
//洛谷p4231

 二维差分数组

洛谷p3397

 

#include<bits/stdc++.h>
using namespace std;


int n,m;
int a[1005][1005];


int main()
{
    
    
    cin>>n>>m;
    for(int i=1,xs,ys,xe,ye;i<=m;i++)
    {
        cin>>xs>>ys>>xe>>ye;
        a[xe+1][ye+1]++;
        a[xs][ys]++;
        a[xe+1][ys]--;
        a[xs][ye+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];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)cout<<a[i][j]<<' ';
        cout<<endl;
    }
    
    
    
    
    return 0;
}

 

posted on 2024-10-29 21:45  秦風  阅读(9)  评论(0编辑  收藏  举报

导航