zoukankan      html  css  js  c++  java
  • bzoj3252

    简单题,每次取出最长链,然后对于练上每个点x,终点在其子树内的链都要减去a[x]

    这显然可以用dfs序+线段树维护

    显然每个点只要删一次即可,复杂度是O(nlogn)

      1 type node=record
      2        s,lx,rx,mx,lp,rp,pb,pe:longint;
      3      end;
      4 
      5 var tree:array[0..100010*4,0..1] of node;
      6     rev:array[0..100010*4] of boolean;
      7     a:array[0..100010] of longint;
      8     q:array[0..100010] of node;
      9     j,t,ans,i,n,m,x,y,k,ch:longint;
     10     c:node;
     11 
     12 procedure swap(var a,b:node);
     13   var c:node;
     14   begin
     15     c:=a;
     16     a:=b;
     17     b:=c;
     18   end;
     19 
     20 procedure put(var a:node; x:longint);
     21   begin
     22     a.lx:=x;
     23     a.rx:=x;
     24     a.mx:=x;
     25     a.s:=x;
     26   end;
     27 
     28 procedure update(var c:node; a,b:node);
     29   begin
     30     c.s:=a.s+b.s;
     31     c.lx:=a.lx; c.lp:=a.lp;
     32     if a.s+b.lx>c.lx then
     33     begin
     34       c.lx:=a.s+b.lx;
     35       c.lp:=b.lp;
     36     end;
     37     c.rx:=b.rx; c.rp:=b.rp;
     38     if b.s+a.rx>c.rx then
     39     begin
     40       c.rx:=b.s+a.rx;
     41       c.rp:=a.rp;
     42     end;
     43 
     44     c.mx:=a.rx+b.lx; c.pb:=a.rp; c.pe:=b.lp;
     45     if c.mx<a.mx then
     46     begin
     47       c.mx:=a.mx;
     48       c.pb:=a.pb;
     49       c.pe:=a.pe;
     50     end;
     51     if c.mx<b.mx then
     52     begin
     53       c.mx:=b.mx;
     54       c.pb:=b.pb;
     55       c.pe:=b.pe;
     56     end;
     57   end;
     58 
     59 procedure build(i,l,r:longint);
     60   var m,j:longint;
     61   begin
     62     if l=r then
     63     begin
     64       put(tree[i,1],a[l]);
     65       put(tree[i,0],-a[l]);
     66       for j:=0 to 1 do
     67       begin
     68         tree[i,j].lp:=l;
     69         tree[i,j].rp:=l;
     70         tree[i,j].pb:=l;
     71         tree[i,j].pe:=l;
     72       end;
     73     end
     74     else begin
     75       m:=(l+r) shr 1;
     76       build(i*2,l,m);
     77       build(i*2+1,m+1,r);
     78       update(tree[i,1],tree[i*2,1],tree[i*2+1,1]);
     79       update(tree[i,0],tree[i*2,0],tree[i*2+1,0]);
     80     end;
     81   end;
     82 
     83 procedure change(i:longint);
     84   begin
     85     swap(tree[i,0],tree[i,1]);
     86     rev[i]:=not rev[i];
     87   end;
     88 
     89 procedure push(i:longint);
     90   begin
     91     rev[i]:=false;
     92     change(i*2);
     93     change(i*2+1);
     94   end;
     95 
     96 procedure work(i,l,r:longint);
     97   var m:longint;
     98   begin
     99     if l=r then
    100     begin
    101       put(tree[i,1],y);
    102       put(tree[i,0],-y);
    103     end
    104     else begin
    105       m:=(l+r) shr 1;
    106       if rev[i] then push(i);
    107       if x<=m then work(i*2,l,m)
    108       else work(i*2+1,m+1,r);
    109       update(tree[i,1],tree[i*2,1],tree[i*2+1,1]);
    110       update(tree[i,0],tree[i*2,0],tree[i*2+1,0]);
    111     end;
    112   end;
    113 
    114 function ask(i,l,r:longint):node;
    115   var m:longint;
    116       s,s1,s2:node;
    117   begin
    118     if (x<=l) and (y>=r) then exit(tree[i,1])
    119     else begin
    120       m:=(l+r) shr 1;
    121       if rev[i] then push(i);
    122       if y<=m then exit(ask(i*2,l,m));
    123       if x>m then exit(ask(i*2+1,m+1,r));
    124       s1:=ask(i*2,l,m);
    125       s2:=ask(i*2+1,m+1,r);
    126       update(s,s1,s2);
    127       exit(s);
    128     end;
    129   end;
    130 
    131 procedure rever(i,l,r,x,y:longint);
    132   var m:longint;
    133   begin
    134     if (x<=l) and (y>=r) then change(i)
    135     else begin
    136       m:=(l+r) shr 1;
    137       if rev[i] then push(i);
    138       if x<=m then rever(i*2,l,m,x,y);
    139       if y>m then rever(i*2+1,m+1,r,x,y);
    140       update(tree[i,1],tree[i*2,1],tree[i*2+1,1]);
    141       update(tree[i,0],tree[i*2,0],tree[i*2+1,0]);
    142     end;
    143   end;
    144 
    145 begin
    146   readln(n);
    147   for i:=1 to n do
    148     read(a[i]);
    149   build(1,1,n);
    150   readln(m);
    151   for i:=1 to m do
    152   begin
    153     read(ch);
    154     if ch=1 then
    155     begin
    156       readln(x,y,k);
    157       ans:=0;
    158       t:=0;
    159       for j:=1 to k do
    160       begin
    161         c:=ask(1,1,n);
    162         if c.mx>0 then ans:=ans+c.mx
    163         else break;
    164         rever(1,1,n,c.pb,c.pe);
    165         inc(t);
    166         q[t]:=c;
    167       end;
    168       for j:=t downto 1 do
    169         rever(1,1,n,q[j].pb,q[j].pe);
    170       writeln(ans);
    171     end
    172     else begin
    173       readln(x,y);
    174       work(1,1,n);
    175     end;
    176   end;
    177 end.
    View Code
  • 相关阅读:
    Python Flask数据库连接池
    Python Flask 配置文件
    Flask 通过扩展来实现登录验证
    Flask 的系统学习
    Python Flask装饰器登录验证
    Django 批量导入文件
    fedora25的免密码rsync服务配置
    linux强制拷贝避免输入yes方法
    linux系统web站点设置-http基础设置
    rsync用法详细解释
  • 原文地址:https://www.cnblogs.com/phile/p/4553206.html
Copyright © 2011-2022 走看看