PPT1 例3

来源:互联网 发布:淘宝永久封店重新开店 编辑:程序博客网 时间:2024/05/09 03:47

题意/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.
3 0
原创粉丝点击