题意/Description:
把例2稍加改动,规定:线段的颜色可以相同。连续的相同颜色被视作一段。问x轴被分成多少段。
读入/Input:
(不详)
4 20 //四条,总长度为20
10 19 1
2 9 2
5 13 3
15 17 4
输出/Output:
x轴被分成多少段。
题解/solution:
这题和例2有很多相似的地方,改改就过了。
主要算法不变:
定义cover如下:cover=-1表示该区间由多种颜色组成。cover>=0表示该区间只有一种单一的颜色cover。
统计算法改改:
如何判断是两段颜色相同:lt表示最左边的颜色,rt表示最右边的颜色。只要lt=rt相等就一样,可是两边没有颜色也会统计,所以条件为lt=rt<>0。最后统计的减一。
代码/Code:
type
arr=record
cover:longint;
end;
var
tree:array[0..2001] of arr;
n,m,ans,tk,kt:longint;
f:array[0..2001] of longint;
procedure ins(p,l,r,a,b,c:longint);
var
m:longint;
begin
with tree[p] do
begin
if cover<>c then
begin
m:=(l+r) div 2;
if (a=l) and (b=r) then cover:=c else
begin
if cover>=0 then
begin
tree[p*2].cover:=cover;
tree[p*2+1].cover:=cover;
cover:=-1;
end;
if b<=m then ins(p*2,l,m,a,b,c) else
if a>=m then ins(p*2+1,m,r,a,b,c) else
begin
ins(p*2,l,m,a,m,c);
ins(p*2+1,m,r,m,b,c);
end;
end;
end;
end;
end;
function count(p,l,r:longint;var lt,rt:longint):longint;
var
tl,tr,m:longint;
begin
m:=(l+r) div 2;
with tree[p] do
begin
if cover>=0 then
begin
lt:=cover;
rt:=cover;
exit(1);
end else
if r-l>1 then
begin
ans:=count(p*2,l,m,lt,tl)+count(p*2+1,m,r,tr,rt);
if (tl=tr) and (tl>=0) then ans:=ans-1;
count:=ans;
end;
end;
end;
procedure main;
var
a,b,z,i:longint;
begin
readln(n,m);
for i:=1 to n do
begin
readln(a,b,z);
ins(1,1,m,a,b,z);
end;
end;
begin
main;
write(count(1,1,m,tk,kt));
end.