题目链接:
暴力代码详解:
#include<stdio.h>
#include<iostream>
using namespace std;
#include<string.h>
int arr[(int)1e4 + 3];
int main()
{
memset(arr, 0, sizeof(arr) / sizeof(arr[0]));//给arr全部初始化为0
int l, m, x, y;
cin >> l >> m;
while (m--)//m次循环
{
cin >> x >> y;
for (int i = x; i <= y; i++)
{
arr[i] = 1;
}//将被占用过的地方标记
}
int sum = 0;
for (int i = 0; i <= l; i++)
{
if (arr[i] == 0)
sum++;
}//统计未被标记的地方
cout << sum;
return 0;
}
差分代码详解:
#include<iostream>
#include<stdio.h>
using namespace std;
int arr[(int)1e4 + 3] = { 0 };
int main()
{
int l, m, x, y;
cin >> l >> m;
while (m--)//m次循环
{
cin >> x >> y;
arr[x]++;
arr[y + 1]--;
}//差分的精髓所在
int sum = 0, rank = 0;
for (int i = 0; i <= l; i++)
{
rank += arr[i];//通过状态改变量监控该位置是否被使用
if (rank == 0) sum++;
}
cout << sum;
return 0;
}
总结:对于暴力来说对于很多题目都会不适用哦,该题目给对的数据范围较小,所以并没有出现超时的现象,要想更进一步,我们还是要掌握差分法,该题目差分的精髓就在于状态改变的掌控,处于该颗树不被移动的情况是哪种,并把该状态求和。
PS:加油加油加油加油加加油加油加油加油!