差分(一维与二维)与等差数列问题
利用差分的思想解决 多次对数组区间加相同数,或者加一个等差数列
最好思路:从目标数列往前推两次前缀和,反推差分数组应该怎么加
#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; }