zoukankan      html  css  js  c++  java
  • 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.
    
  • 相关阅读:
    某电校园网
    M100(3) 无线数传
    【转】大厦将倾,互联网将如何变革传统行业(下)
    【转】大厦将倾,互联网将如何变革传统行业(上)
    【转】用户十秒离开你网站的25个原因
    web及移动应用测试知识总结
    【转】Watir, Selenium & WebDriver
    ICMP协议
    我不会OOO,仍然可以XXX_转
    查看网络连接数目(解决TIME_WAIT过多造成的问题_转)
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319704.html
Copyright © 2011-2022 走看看