PPT1 例3

题意/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.
原文地址:https://www.cnblogs.com/zyx-crying/p/9319704.html