差分
先说一道题目:
给出一个数组,m个操作每次操作从l到r位置的每个数加上z
最后给出q个查询,查询每次l到r位置的区间和
差分做法:
设d[i] = a[i]-a[i-1] (1<i≤n,d[1]=a[1]);
设f[i] = f[i-1]+d[i] (1<i≤n,f[1]=d[1]=a[1]);
设sum[i] = sum[i-1]+f[i] (1<i≤n,sum[1]=f[1]=d[1]=a[1])。
举个例子 求一下1-3的区间和
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100010;
int n,m,q,l,r,z;
int a[maxx],d[maxx],f[maxx],sum[maxx];
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
d[i]=a[i]-a[i-1];
}
for(int i=1;i<=m;i++){
cin>>l>>r>>z;
d[l]+=z;
d[r+1]-=z;
}
for(int i=1;i<=n;i++){
f[i] = f[i-1]+d[i];
sum[i]=sum[i-1]+f[i];
}
for(int i=1;i<=q;i++){
cin>>l>>r;
cout<<sum[r]-sim[l-1]<<endl;
}
return 0;
}
京公网安备 11010502036488号