一、一维前缀和和二维前缀和
1)一维前缀和就像是多段直线拼接起来
2)二维前缀和则是像多个矩形相加起来。
以下是洛谷P8218(利用前缀和写程序)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];
}
cin>>m;
int b[m+1],c[m+1];
for(int i=1;i<=m;i++){
cin>>b[i]>>c[i];
}
for(int i=1;i<=m;i++){
cout<<a[c[i]]-a[b[i]-1]<<endl;
}
return 0;
}
二、一维差分数组
再经过视频学习后,我理解为差分数组就是记录某个数经过多个操作后所产生的变化,然后与原状态相加,就得到修改后的状态。
以下是洛谷P2367
#include<bits/stdc++.h>
using namespace std;
int d[10000000];
void f(int l,int r,int v){
d[l-1]+=v;
d[r]-=v;
}
int main()
{
int n,p,l,r,v;
cin>>n>>p;
int arr[n];
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<p;i++){
cin>>l>>r>>v;
f(l,r,v);
}
for(int i=0;i<n;i++){
d[i]+=d[i-1];
}
for(int i=0;i<n;i++){
arr[i]+=d[i];
}
sort (arr,arr+n);
cout<<arr[0];
return 0;
}