• 覆盖统计


    覆盖统计(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.
  • 相关阅读:
    documentFragment文档碎片
    OpenResty之resty.limit.count 模块介绍
    vue前端分页多条件搜索
    element ui Tree树形控件获取未全选父节点和子节点id
    如何使 pdf 文件在浏览器里面直接下载而不是打开
    关于本博客
    圆锥曲线基础知识点
    NOI2021游记
    20210716模拟赛
    计数+动态规划
  • 原文地址:https://www.cnblogs.com/zjhl2/p/3855967.html
Copyright © 2020-2023  润新知