这道题是一个线段树题。
和线段树一差不多,
就直接上代码:
#include
#include
#include
#include
using namespace std;
int s,n,ans,l[400010],r[400010];
int tree[400010],f[400010];
void insert(int x,int l,int r,int a,int b,int color)
{
int mid=(l+r)/2;
if(tree[x]!=color)
{
if(a==l&&b==r)
tree[x]=color;
else
{
if(tree[x]>=0)
{
tree[2*x]=tree[2*x+1]=tree[x];
tree[x]=-1;
}
if(b<=mid)
insert(2*x,l,mid,a,b,color);
else if(a>=mid)
insert(2*x+1,mid,r,a,b,color);
else
{
insert(2*x,l,mid,a,mid,color);
insert(2*x+1,mid,r,mid,b,color);
}
}
}
}
void ccount(int x,int l,int r)
{
int mid=(l+r)/2;
if(tree[x]>=0)
f[tree[x]]=1;
else if(r-l>1)
{
ccount(2*x,l,mid);
ccount(2*x+1,mid,r);
}
}
int main()
{
cin>>s>>n;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&l[i],&r[i]);
insert(1,1,s,l[i],r[i],i);
}
ccount(1,1,s);
for(int i=1; i<=n; i++)
if(f[i]==1)
ans++;
cout<<ans;
return 0;
}