• BZOJ1251: 序列终结者


    1251: 序列终结者

    Time Limit: 20 Sec  Memory Limit: 162 MB
    Submit: 2301  Solved: 923
    [Submit][Status]

    Description

    网上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列 要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】 给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2. 将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。

    Input

    第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

    Output

    对于每个第3种操作,给出正确的回答。

    Sample Input

    4 4
    1 1 3 2
    1 2 4 -1
    2 1 3
    3 2 4

    Sample Output

    2
    【数据范围】
    N<=50000,M<=100000。

    HINT

     

    Source

    题解:
    这题还没有维护数列BT,就敢叫序列终结者?
    注意标记的传递和边界的处理,专门增加的两个节点不能影响到答案,0 也不能影响到答案
    代码:
      1 {$inline on}
      2 {$M 1000000000,0,maxlongint}
      3 const maxn=100000+1000;
      4 var s,fa,mx,tag,v,id,a:array[0..maxn] of longint;
      5     rev:array[0..maxn] of boolean;
      6     c:array[0..maxn,0..1] of longint;
      7     i,j,n,m,x,y,z,tot,rt,now,l,r:longint;
      8     ch:longint;
      9     procedure swap(var x,y:longint);inline;
     10      var t:longint;
     11      begin
     12       t:=x;x:=y;y:=t;
     13      end;
     14     function max(x,y:longint):longint;inline;
     15      begin
     16       if x>y then exit(x) else exit(y);
     17      end;
     18 procedure pushup(x:longint);inline;
     19  begin
     20   l:=c[x,0];r:=c[x,1];
     21   s[x]:=s[l]+s[r]+1;
     22   mx[x]:=max(v[x],max(mx[l],mx[r]));
     23  end;
     24 procedure rever(x:longint);inline;
     25  begin
     26   if x=0 then exit;
     27   rev[x]:=not(rev[x]);
     28   swap(c[x,0],c[x,1]);
     29  end;
     30 procedure change(x,val:longint);inline;
     31  begin
     32   if x=0 then exit;
     33   inc(tag[x],val);
     34   inc(v[x],val);
     35   inc(mx[x],val);
     36  end;
     37 procedure pushdown(x:longint);inline;
     38  var l,r:longint;
     39  begin
     40   l:=c[x,0];r:=c[x,1];
     41   if tag[x]<>0 then
     42     begin
     43      change(l,tag[x]);change(r,tag[x]);
     44      tag[x]:=0;
     45     end;
     46   if rev[x] then
     47     begin
     48      rever(l);rever(r);
     49      rev[x]:=false;
     50     end;
     51  end;
     52 procedure rotate(x:longint;var k:longint);inline;
     53  var y,z,l,r:longint;
     54  begin
     55   y:=fa[x];z:=fa[y];
     56   l:=ord(c[y,1]=x);r:=l xor 1;
     57   if y=k then k:=x else c[z,ord(c[z,1]=y)]:=x;
     58   fa[x]:=z;fa[y]:=x;fa[c[x,r]]:=y;
     59   c[y,l]:=c[x,r];c[x,r]:=y;
     60   pushup(y);pushup(x);
     61  end;
     62 procedure splay(x:longint;var k:longint);inline;
     63  var y,z:longint;
     64  begin
     65   while x<>k do
     66    begin
     67     y:=fa[x];z:=fa[y];
     68     if y<>k then
     69      if (c[z,0]=y) xor (c[y,0]=x) then rotate(x,k)
     70      else rotate(y,k);
     71     rotate(x,k);
     72    end;
     73  end;
     74 procedure build(l,r,f:longint);inline;
     75  var x,y,z,mid:longint;
     76  begin
     77   if l>r then exit;
     78   mid:=(l+r)>>1;
     79   x:=id[mid];y:=id[f];
     80   v[x]:=a[mid];
     81   c[y,ord(mid>f)]:=x;fa[x]:=y;
     82   if l=r then
     83     begin
     84      s[x]:=1;mx[x]:=v[x];
     85      exit;
     86     end;
     87   build(l,mid-1,mid);build(mid+1,r,mid);
     88   pushup(x);
     89  end;
     90 function find(x,rank:longint):longint;inline;
     91  var l,r:longint;
     92  begin
     93   pushdown(x);
     94   l:=c[x,0];r:=c[x,1];
     95   if s[l]+1=rank then exit(x)
     96   else if s[l]>=rank then exit(find(l,rank))
     97   else exit(find(r,rank-s[l]-1));
     98  end;
     99 procedure split(l,r:longint;var x,y:longint);inline;
    100  begin
    101   x:=find(rt,l);y:=find(rt,r);
    102   splay(x,rt);splay(y,c[x,1]);
    103  end;
    104 procedure main;
    105  begin
    106   readln(n,m);
    107   for i:=1 to n+2 do id[i]:=i;
    108   fillchar(a,sizeof(a),0);
    109   a[1]:=-maxlongint;a[n+2]:=-maxlongint;
    110   mx[0]:=-maxlongint;
    111   build(1,n+2,0);rt:=(n+3)>>1;
    112   for i:=1 to m do
    113    begin
    114     read(ch);
    115     case ch of
    116     1:begin
    117       readln(l,r,z);split(l,r+2,x,y);
    118       change(c[y,0],z);
    119       end;
    120     2:begin
    121       readln(l,r);split(l,r+2,x,y);
    122       rever(c[y,0]);
    123       end;
    124     3:begin
    125       readln(l,r);split(l,r+2,x,y);
    126       writeln(mx[c[y,0]]);
    127       end;
    128     end;
    129    end;
    130  end;
    131 begin
    132   assign(input,'input.txt');assign(output,'output.txt');
    133   reset(input);rewrite(output);
    134   main;
    135   close(input);close(output);
    136 end. 
    View Code
  • 相关阅读:
    Zookeeper----1.基础知识
    UML图
    VUE入门3---axios
    VUE入门2---vue指令
    谁先执行?props还是data或是其他? vue组件初始化的执行顺序详解
    vue双向绑定原理分析
    HTML/CSS -- 浏览器渲染机制
    vue工作原理分析
    导入导出需求整理
    .NET 异步详解
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3903615.html
Copyright © 2020-2023  润新知