SSL2645 线段树练习题2【线段树】

SSL2645 线段树练习题2【线段树】_第1张图片
这道题是一个线段树题。
和线段树一差不多,

就直接上代码:

#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)  //>=0表示只有一种颜色,-1表示只有一种颜色
{
	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++
       ans++;
    cout<<ans;
    return 0;
}

你可能感兴趣的:(线段树,题解)