打扫教室
一天蒜头君被要求打扫 n 间连续的教室(编号从 1 到 n),但是蒜头君打扫教室有点随心,想打扫哪间教室就打扫哪间教室,导致最后自己都不知道是否所有的教室都打扫了。
现在告诉你蒜头君打扫了哪些教室,你能告诉蒜头君他还有多少间教室没有打扫吗?
输入格式
第一行输入两个整数 n,m 分别表示教室的个数和蒜头君打扫教室区间段的个数。
接下来 m 行,每行有两个整数 l, r,表示蒜头君打扫了 [l, r] 区间的教室。
输出格式
输出一个整数,表示蒜头君还有多少间教室没有打扫。
数据范围
对于 50% 的数据:1 ≤ n, m ≤1 0^3。
对于 100% 的数据:1 ≤ n, m≤ 10^6, 1≤ l ≤ r ≤ n。
样例输入复制
10 3
1 5
3 7
9 10
样例输出复制
1
思路:
做的时候还不会差分,用暴力O(n^2)拿了50%的分
后来才知道用差分优化,O(n)的复杂度
代码:
#include<iostream>
using namespace std;
int a[1000005];//多开一位
int main(){
int n, m, sum = 0;
cin >> n >> m;
for(int i = 1; i <= m; i++){
int l, r;
cin >> l >> r;
a[l]++; //差分数组操作,给区间内的元素都加一
a[r + 1]--;
}
for(int i = 1; i <= n; i++){
a[i] += a[i - 1]; //前缀和
if(!a[i]){ //说明没有被打扫
sum++;
}
}
cout << sum << endl;
return 0;
}
贴一下暴力做法:
#include<iostream>
using namespace std;
int a[1000005];
int sum;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++){
int l, r;
cin >> l >> r;
for(int i = l; i <= r; i++){
a[i]++;
}
}
for(int i = 1; i <= n; i++){
if(a[i] == 0){
sum++;
}
}
cout << sum << endl;
return 0;
}