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.
  • 相关阅读:
    Python基础之函数与装饰器
    Python基础(字符编码与文件处理)
    周末练习(一)
    字典(习题)
    IOS代码库
    (转载)二叉树
    单链表的初始化和创建(尾插法)
    (转载)C语言单链表实现19个功能完全详解
    (转载)ios view的frame和bounds之区别(位置和大小)
    (转载)OC语法总结
  • 原文地址:https://www.cnblogs.com/zjhl2/p/3855967.html
Copyright © 2011-2022 走看看