A - 校门外的树 题解
解法一(思路一):暴力模拟
//A - 校门外的树
#include<cstdio>
#include<iostream>
int road[10001];//利用全局静态数组全部初始化为0的特点
int calTree(int endOfRoad) {//这个函数用于计算还剩下多少树
int cnt = 0;
for (int i = 0; i <= endOfRoad; i++)
{
if (road[i] == 0)cnt++;
}
return cnt;
}
void cutDown(int begin, int end) {//这个函数模拟砍树
for (int i = begin; i <= end; i++)road[i] = 1;
}
int main(void)
{//main方法
using namespace std;
int l, m; cin >> l >> m;
for (int i = 0; i < m; i++)
{
int begin, end; scanf("%d%d", &begin, &end);
cutDown(begin, end);
}
int r = calTree(l);
cout << r;
return 0;
}
思路二:数学抽象-求并集问题
但是上面的方法太简单了,实际上有了两层循环,那么时间复杂度大概就是O(n²)。有没有方法可以下降到O(n)甚至O(logn)呢。而实际上这个问题很像有限覆盖问题。我还没学拓扑学,