AcWing 422. 校门外的树 暴力+区间和并+差分
原题链接
简单
作者:
每一刻都是崭新的
,
2021-04-04 21:27:43
,
所有人可见
,
阅读 368
/*
区间合并
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int>PII;
vector<PII> segs;
int merge(vector<PII> &segs)
{
int res = 0;
sort(segs.begin(),segs.end());
int st = -1,ed = -1; //不在区间内 作为初始化
for(auto seg:segs){
if(ed < seg.first){
if(st!= -1) res += ed-st+1;
st = seg.first,ed = seg.second;
}
else ed = max(ed,seg.second);
}
if(st!=-1) res += ed-st+1;
return res;
}
int main(void)
{
int L,M;
cin>>L>>M;
while(M--){
int l,r;
cin>>l>>r;
segs.push_back({l,r});
}
int sum = merge(segs);
cout<<L+1-sum;
return 0;
}
*/
/*
标记 true false 或者1 0
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e4+10;
int n,m;
bool a[N];
int main(void)
{
cin>>n>>m;
for(int i=0;i<=n;i++) a[i]=true;
for(int i=0;i<m;i++){
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++){
a[i] = false;
}
}
int cnt=0;
for(int i=0;i<=n;i++){
if(a[i]) cnt++;
}
cout<<cnt;
return 0;
}
*/
/*
差分
对于每一个区间需要把这个区间的所有树移走,看成对于每一个区间内的所有数加1,
结果是区间内的数没有加过的数的个数。这是典型的差分模型
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e4+10;
int a[N];
int main(void)
{
int n,m;
cin>>n>>m;
while(m--){
int l,r;
cin>>l>>r;
a[l]++,a[r+1]--; //l-r都是 >=1的值 因为有重复区间
}
/*
int res=!a[0]; //前缀和要从1开始
for(int i=1;i<=n;i++) res+= !(a[i]+=a[i-1]);
cout<<res;
*/
int res=0;
for(int i=0;i<=n;i++){
if(i) a[i] += a[i-1];
if(!a[i]) res++;
}
cout << res;
return 0;
}