代码1:

#include <bits/stdc++.h>
using namespace std;
//前缀和表示区域内树的数量

int l, m, s[10005], a[10005];

int main(){
    cin >> l >> m;
    for(int i = 0; i <= l; i ++)
        a[i] = 1, s[i] = i + 1;

    while(m --) {
        int x, y; cin >> x >> y;
        //区域内每个点都变为0
        for(int i = x; i <= y; i ++) a[i] = 0;
    }

    //求前缀和
    s[0] = a[0];
    for(int i = 1; i <= l; i ++)
        s[i] = s[i - 1] + a[i];

    cout << s[l];
}


非常不理解,求前缀和的部分也是从前到后遍历一遍,但是换成以下代码就会超时:

    int ans = 0;
    for(int i = 1; i <= l; i ++)
        if(a[i]) ans ++;
    cout << ans

只是用了个前缀和居然就能过。

代码2:

看了其他人的题解,使用了差分算法。我不是很熟悉,所以学习了以后自己写了一遍。

#include <bits/stdc++.h>
using namespace std;
//前缀和表示区域内树的数量

int l, m, s[10005], a[10005];

int main(){
    cin >> l >> m;

    while(m --) {
        int x, y; cin >> x >> y;
        //差分
        a[x] ++, a[y + 1] --;
    }

    //求前缀和 判断剩余数量

    s[0] = a[0];
    for(int i = 1; i <= l; i ++)
        s[i] = s[i - 1] + a[i];

    //s值为0即代表有树
    int ans = 0;
    for(int i = 0; i <= l; i ++)
        if(s[i] == 0) ans ++;

    cout << ans;

}