###枚举
##差分 前缀和
差分:对一个区间加上一个值,只需考虑两端位置即可。
假设有一数组 a[0] a[1] a[2]
假设有一数组 a[1] a[2] a[3] … a[n]
b[i] = a[i] - a[i-1]; b[0] = a[0];
那么a[i] = b[0] + b[1] + b[2] +…+b[n]
则 b[i] 就是a数组的差分数组
换句话说a数组就是b数组的前缀和
当对 数组a某一区间加上一个数,只需考虑区间两端就行。
b[start] ++; b[end-1] --;
b数组也可以转化成a数组
for(int i=0;i<n;i++)
{
b[i] += b[i-1];
}
//转化后的b数组就是a数组
例题
链接:https://ac.nowcoder.com/acm/problem/16649
来源:牛客网
第一行有两个整数:L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出描述:
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
示例1
输入
复制
500 3
150 300
100 200
470 471
输出
复制
298
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include <typeinfo>
#define ll long long
using namespace std;
int a[10003];
int main()
{
int l,m;
scanf("%d %d",&l,&m);
int s,e;
a[0]=1;
for(int i=0;i<m;i++)
{
scanf("%d %d",&s,&e);
a[s]--;
a[e+1]++;
}
int ans = 0;
if(a[0]==1)
ans++;
for(int i=1;i<=l;i++)
{
a[i] += a[i-1];
if(a[i]>0)
ans++;
}
cout << ans << endl;
return 0;
}