线段树练习题三
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);
}