覆盖统计

覆盖统计(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.
原文地址:https://www.cnblogs.com/zjhl2/p/3855967.html