• codevs3243:区间翻转,线段树


    题目描述 Description
    给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列

    输入描述 Input Description
    第一行一个数N,下一行N个数表示原始序列,在下一行一个数M表示M次翻转,之后的M行每行两个数L,R表示将区间[L,R]翻转。

    输出描述 Output Description
    一行N个数 , 表示最终序列。

    样例输入 Sample Input
    4
    1 2 3 4
    2
    1 2
    3 4

    样例输出 Sample Output
    2 1 4 3

    数据范围及提示 Data Size & Hint
    对于30%的数据满足n<=100 , m <= 10000
    对于100%的数据满足n <= 150000 , m <= 150000
    对于100%的数据满足n为2的幂,且L = i * 2^j + 1 , R = (i + 1) * 2^j

    帖代码,感谢XS的调试

    program cx;
    var i,BTM,n,m,l,r:longint;
        trs,trlc,trrc,trw,trfz:array[0..100]of longint;
    
    procedure down(t:longint);
    var temp:longint;
    begin
      if trfz[t]=0 then exit;
      trfz[t]:=0;
      trfz[trlc[t]]:=trfz[trlc[t]]xor 1;
      trfz[trrc[t]]:=trfz[trrc[t]]xor 1;
      temp:=trlc[t];
      trlc[t]:=trrc[t];
      trrc[t]:=temp;
    end;
    
    function cmp(x:longint):longint;         //XS令人苦笑不得的函数,求左子树SIZE
    begin
       exit(trs[trlc[x]]);
    end;
    
    procedure change(t,ll,rr:longint);
    begin
      if (ll=1)and(rr=trs[t]) then
        begin
          trfz[t]:=trfz[t] xor 1;
          exit;
        end;
      down(t);
      if ll-cmp(t)>=1 then
        begin
          ll:=ll-cmp(t);
          rr:=rr-cmp(t);
          change(trrc[t],ll,rr);
        end
          else
            change(trlc[t],ll,rr);
    end;
    
    procedure print(t:longint);
    var i:longint;
    begin
      if trlc[t]=0 then
        begin
          write(trw[t],' ');
          exit;
        end;
      down(t);
      print(trlc[t]);
      print(trrc[t]);
    end;
    
    begin
    assign(input,'gym.in');reset(input);
      read(n);
      BTM:=1;
      while BTM<n do BTM:=BTM<<1;
      dec(BTM);
      for i:=BTM+1 to BTM+n do
        begin
          read(trw[i]);
          trs[i]:=1;
        end;
      for i:=BTM downto 1 do
        begin
          trlc[i]:=i<<1;
          trrc[i]:=(i<<1)+1;
          trs[i]:=trs[trlc[i]]+trs[trrc[i]];
        end;
    
      read(m);
      for i:=1 to m do
        begin
          read(l,r);
          change(1,l,r);
        end;
      print(1); writeln;
    close(input);
    end.
  • 相关阅读:
    centos的DNS服务工作流程及搭建
    将博客搬至CSDN
    全自动网络安装centos(一)安装前准备工作
    网站私有CA证书制作
    LINUX之启动流程
    脚本判断选择语句常用命令
    linux 常用端口
    linux之网卡绑定
    centos7 无法启动网络(service network restart)错误解决办法(转)
    Linux的磁盘配额详解(Quota)
  • 原文地址:https://www.cnblogs.com/cww97/p/7534042.html
Copyright © 2020-2023  润新知