zoukankan      html  css  js  c++  java
  • 覆盖统计

    覆盖统计(axis.c/cpp/pas)
    【题目大意】
    数轴上有一些点,从 1 标记到n,逐渐被线段覆盖, 求
    每次覆盖后未被覆盖的点的个数。
    【输入数据】
    第一行,点数 n,操作数k。
    接下来k 行,每行是线段的左右端点 l,r
    【输出数据】
    k行,每次操作后未被覆盖的点。
    【输入样例】
    9 3
    3 3
    5 7
    1 9
    【输出样例】
    8
    5
    0
    【数据范围】
    对于 30%的数据,1<=n,k<=2000;
    对于 100%的数据,1<=n<=200000,k<=600000

    ----------------------------------------

    树什么的不熟练啊,就想出了一种神奇的方法,覆盖的地方false掉,用一个next函数跳转,原来覆盖过的地方就不扫了,这样可以省去很多时间。最后偶尔更新一下,使next函数简化,数据全过啦!!!(结果后来发现更新反而更花时间,不更新能够更快AC。。。。)

    var
      b:array[0..200001]of boolean;
      back,next:array[0..200001]of longint;
      i,j,n,k,l,r,ans,last:longint;
    begin
      assign(input,'axis.in');  assign(output,'axis.out');
      reset(input);  rewrite(output);
      read(n,k);
      fillchar(b,sizeof(b),true);
      ans:=n;
      for i:=1 to n do next[i]:=i+1;
      for j:=1 to k do
        begin
          read(l,r);
          i:=l;
          repeat
            begin
              if b[i] then
                begin
                  i:=i+1;
                  next[i-1]:=r+1;
                  b[i-1]:=not b[i-1];
                  dec(ans);
                end
              else i:=next[i];
            end;
          until (i>r)or(i>n);
          writeln(ans);
          if j mod 10000=0 then   //更新next函数
            begin
              last:=n+1;
              for i:=n downto 1 do
                begin
                  if (b[i]=false)and(b[i-1]=true) then
                     next[i]:=last;
                  if (b[i]=true)and(b[i-1]=false) then
                     last:=i;
                end;
            end;
        end;
      close(input);   close(output);
    end.
  • 相关阅读:
    my first blog
    iFrame 父子窗口通讯
    关于手机端横屏竖屏问题
    IE环境规定div高度必须大于字体高度的问题
    adMob的旋转方法
    影响一个UIView是否能正常显示的几个因素
    iphone编译时的注意事项
    Cocos2d的字体生成软件Hiero v2.0 Bitmap Font Tool的一些问题
    编写Web前端代码的注意事项
    Cocos2d的SpriteSheet在多层图片时出现的问题
  • 原文地址:https://www.cnblogs.com/zjhl2/p/3855967.html
Copyright © 2011-2022 走看看