线段树练习题三(线段树)(未做)

线段树练习题三

Description

给定一条长度为m的线段,有n个操作,每个操作有3个数字x,y,z表示把区间[x,y]染成颜色z,询问染完色之后,这条长度为m的线段一共有几种颜色。规定:线段的颜色可以相同。连续的相同颜色被视作一段。问x轴被分成多少段。
在这里插入图片描述

Sample Input

4 20 //四条,总长度为20
10 19 1
2 9 2
5 13 3
15 17 4

Sample Output

7

Hint

数据规模
N <= 10000
M <= 1000000

未AC代码

#include<cstdio>
#include<iostream>
using namespace std;
int s,cover[100005];
void insert(int x,int l,int r,int a,int b,int num)
{
	if(a>b||l==r)return;
	if(cover[x]==num)return;
	if(l==a&&r==b)cover[x]=num;
	else
	{
		if(cover[x]!=-1)
		{
			cover[x*2]=cover[x*2+1]=cover[x];
			cover[x]=-1;
		}
		int mid=(l+r)/2;
		if(b<=mid)insert(x*2,l,mid,a,b,num);
		else if(a<mid)insert(x*2+1,mid+1,r,a,b,num);
		else
		{
			insert(x*2,l,mid,a,mid,num);
			insert(x*2+1,mid+1,r,mid+1,b,num);
		}
	}
}
int sc(int x,int l,int r,int &lc,int &rc)
{
	int lt=0,rt=0;
	if(cover[x]!=-1)
	{
		rc=lc=cover[x];
		return 1;
	}
	if(l==r)return 1;
	int mid=(l+r)/2;
	s=sc(x*2,l,mid,lc,lt)+sc(x*2+1,mid+1,r,rt,rc);
	return s-(lt==rt?1:0);	
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		insert(1,1,m,x,y,z);
	}
	int c=0,d=0;
	cout<<sc(1,1,m,c,d);
}

猜你喜欢

转载自blog.csdn.net/weixin_45524309/article/details/107507728