差分与前缀和

技巧介绍:

前缀和:

sum[0]=a[0]

sum[1]=a[0]+a[1]------>sum[1]=sum[0]+a[1]

sum[2]=a[0]+a[1]+a[2]------>sum[2]=sum[1]+a[2]

sum[3]=a[0]+a[1]+a[2]+a[3]------>sum[3]=sum[2]+a[3]

.........

前缀和就是类似与求数列前n项和,因此对上述进行归纳即可得到

sum[i]=sum[i-1]+a[i]

差分:

d[1]=a[1]-a[0]=a[1]-0=a[1]

d[2]=a[2]-a[1]

d[3]=a[3]-a[2]

这时要想表示每一项a[i]即可对d[i]求前缀和

d[1]+d[2]=a[1]-a[0]+a[2]-a[1]="a[2]"

d[1]+d[2]+d[3]=a[2]+a[3]-a[2]="a[3]"

即a[i]=a[i-1]+d[i];

差分的作用: 对区间的数进行修改,可以只改变区间端点的值即可

alt

链接:https://ac.nowcoder.com/acm/contest/27269/F 来源:牛客网

using namespace std;
int d[100000010],sum[100000010];
int main(){
    long long l,m,s=0;
    cin>>l>>m;
    while(m--){
        long long a,b;
        cin>>a>>b;
        if(a>b)swap(a,b);
        d[a]+=1;//对区间两端点进行操作,即对该区间内所有值进行修改(加上或减去某一个值)
        d[b+1]-=1;
    }
    sum[0]+=d[0];//非常重要!!!
    for(int i=1;i<=l;i++){
        sum[i]=sum[i-1]+d[i];//求前缀和
    }
    for(int i=0;i<=l;i++){
        if(sum[i]){
            s++;
        }
    }
    cout<<l+1-s;
    return 0;
}