1.定义:

对于离线数列d,建立差分数组f,则 f[1]=d[1],f[i]=d[i]-d[i-1]

2.性质

(1):对于各个项,有d[2]=d[1]+ (d[1]-d[1]) =f[1]+f[2],即:d[i]=Σf[i]

(2):求数列的前缀和  sum(x)=Σ(i=1,x)Σ(j=1,i)f [ j ]=Σ(i=1,x)(x-i+1)*f(i)

3.作用

快速处理区间加减操作,对[L,R]的数都加上x,则f[L]+=x,f[R+1]-=x;

询问区间和问题,[L,R]的值 ans=sum[R]-sum[L-1];

例题:http://acm.hdu.edu.cn/showproblem.php?pid=1556

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int d[maxn],f[maxn];
int main( ) {
    int n;
    while(cin>>n) {
        if(n==0) break;
        for(int i=1;i<=n;i++) d[i]=0,f[i]=0;
        for(int i=1;i<=n;i++) {
            int a,b;
            cin>>a>>b;
            f[a]+=1;
            f[b+1]-=1;
        }
        int ans=0;
        for(int i=1;i<=n;i++) {
            ans+=f[i];
            if(i==n) cout<<ans<<endl;
            else cout<<ans<<" ";
        }

     }
    return 0;
}
View Code
01-20 11:03