bzoj1588 [HNOI2002]营业额统计 (treap)

本文介绍了一种使用Treap实现平衡树的方法,并提供了完整的代码示例。通过随机优先级进行旋转操作来保持树的平衡,进而高效地实现查找、插入等操作。文中详细解释了前驱和后继节点的查询过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平衡树裸题

只需要求前驱后驱

 

treap写法

const
  mm=1<<30;
  maxnumber=500000;
  maxn=500000;

var
  left,right,fix,key:array[0..maxn]of longint;
  t,n,ans,i,j,k,l,tot:longint;

function min(x,y:longint):longint;
begin
  if x<y then exit(x);
  exit(y);
end;

function max(x,y:longint):longint;
begin
  if x<y then exit(y);
  exit(x);
end;

procedure lt(var t:longint);
var
  k:longint;
begin
  k:=right[t];
  right[t]:=left[k];
  left[k]:=t;
  t:=k;
end;

procedure rt(var t:longint);
var
  k:longint;
begin
  k:=left[t];
  left[t]:=right[k];
  right[k]:=t;
  t:=k;
end;

procedure insert(var t:longint;v:longint);
begin
  if t=0 then begin
    inc(tot);
    t:=tot;
    key[t]:=v;
    fix[t]:=random(maxnumber)+1;
    left[t]:=0;
    right[t]:=0;
    exit;
  end;
  if v<=key[t] then begin
    insert(left[t],v);
    if fix[left[t]]>fix[t] then rt(t);
  end
  else begin
    insert(right[t],v);
    if fix[right[t]]>fix[t] then lt(t);
  end;
end;

function pred(t,v:longint):longint;
begin
  if t=0 then exit(-mm);
  if v=key[t] then exit(v);
  if v<key[t] then exit(pred(left[t],v))
  else
    exit(max(key[t],pred(right[t],v)));
end;

function succ(t,v:longint):longint;
begin
  if t=0 then exit(mm);
  if v=key[t] then exit(v);
  if v<key[t] then exit(min(key[t],succ(left[t],v)))
  else
    exit(succ(right[t],v));
end;

begin
  t:=0;
  readln(n);
  read(j);
  insert(t,j);
  ans:=j;
  for i:=2 to n do begin
    read(j);
    k:=pred(t,j);
    l:=succ(t,j);
   // writeln(j,' ',k,' ',l);
    if j-k<l-j then ans:=ans+j-k
      else ans:=ans+l-j;
    insert(t,j);
  end;
  writeln(ans);
  readln;
  readln;
end.
View Code

 

转载于:https://www.cnblogs.com/Macaulish/p/4298817.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值