zoukankan      html  css  js  c++  java
  • PPT1 例2

    题意/Description

        桌子上零散地放着若干个不同颜色的盒子,桌子的后方是一堵墙。如右图所示。问从桌子前方可以看到多少个盒子?假设人站得足够远(自己设计测试数据,输入时,由底向上,从左到右)。

     

    读入/Input

    (不详)

    16  //桌子长度
    5   // 盒子数量
    4 7
    12 14
    1 5
    6 10
    11 16


    输出/Output

      可以看到多少个盒子。(4)

     

    题解/solution

        使用一个数组F,初始化为0。遍历线段树,对于每种颜色c对F[c]赋值1。最后统计F中1的个数即可。(注意颜色0应该排除在外,可以在最后减1)


    代码/Code

    type
      arr=record
            cover:longint;
          end;
    var
      tree:array[0..2001] of arr;
      n,m,ans:longint;
      f:array[0..2001] of integer;
    
    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;
    
    procedure count(p,l,r:longint);
    var
      m:longint;
    begin
      m:=(l+r) div 2;
      with tree[p] do
        begin
          if cover>=0 then f[cover]:=1 else
            if r-l>1 then
              begin
                count(p*2,l,m);
                count(p*2+1,m,r);
              end;
        end;
    end;
    
    procedure main;
    var
      a,b,i:longint;
    begin
      fillchar(tree,sizeof(tree),255);
      readln(m);
      readln(n);
      for i:=1 to n do
        begin
          readln(a,b);
          ins(1,1,m,a,b,i);
        end;
    end;
    
    procedure print;
    var
      i:longint;
    begin
      count(1,1,m);
      for i:=0 to m do
        if f[i]=1 then inc(ans);
      writeln(ans);
    end;
    
    begin
      main;
      print;
    end.



  • 相关阅读:
    msvcr120.dll、msvcp120.dll注册失败
    Qt初级-Qt格式
    二级指针的申请与释放
    搜索指定目录下的所有文件或者指定文件(可用于多级目录)
    Java--多线程处理--模拟车辆进入入收费
    Sqlit--学习教程(建立数据库表)
    Sqlit--学习教程(基本操作1)
    Sqlit--学习教程()
    Sqlit--学习教程(命令)
    Sqlit--学习教程(简介)
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319705.html
Copyright © 2011-2022 走看看