#include <cstring>
#include <iostream>
using namespace std;
int main(){
    int L = 0, M = 0, num = 0;
    char tree[10000];
    cin >> L >> M;
    memset(tree, 1, L * sizeof(char));
    for (int i = 0; i < M; i++){
        int a, b;
        cin >> a >> b;
        memset(tree + a * sizeof(char), 0, (b - a + 1) * sizeof(char));        //
    }
    for (int i = 0; i < L; i++){
        num += tree[i] ? 1 : 0;
    }
    cout << num << endl;
}
这是程序
这是原题目
程序出现了不明的bug,当输入
500 3
150 300
100 200
470 471
时,我逐步排查过,依然不明白为什么程序会输出297而非298,而输入
1000 5
0 100
101 200
900 1000
207 400
401 899
时程序又正确地输出了6,这实在令人摸不着头脑ORZ
本来简单的题目却老是出一些不明就里的bug,快怀疑人生了……
明白了……
如果道路长度为x,那么应该有X + 1棵树,所以memset处应为(L + 1) * sizeof(char)而第二个for的第二个参数应为i <= L,问题即解决,而第二个输入之所以正确,是因为输入的环境中最后的一颗树(1000)是被砍伐了的,而第一个输入是错误的是因为本应为1的tree[500]并没有初始化。
经典写程序十分钟,排错一个小时