三维偏序 树套树&cdq分治

一般的最长上升子序列是二维偏序,所以排序后用线段树维护可以达到nlogn程度,但是如果是三元组呢?

因为多了一个偏序关系,所以维护起来相当麻烦。

roosephu说了一句经典的:一维快排,二维归并,三维树状数组,就是一维排序x后,再而在快排保证前一段x小于后一段x基础上归并排序做y,同时此基础上树状数组维护z。(详见http://blog.csdn.net/cjoilmd/article/details/6884432,速度完虐std)

但是,如果用树套树就没这么麻烦,一维排序后,二三维线段树套平衡树。

事实证明在roosephu精心随机的数据下,裸bst比treap要快一半以上。

(被隐掉的是treap旋转等操作)

{$inline on}
uses math;
type rex=record
      x,y,z:longint
     end;
var rt,l,r,d,id,key,maxk:array[1..1048576]of longint;
    ans,ss,n,m,m1:longint;
    f:array[1..500000]of longint;
    a:array[1..500000]of rex;
procedure inf;
begin
 assign(input,'godfarmer.in');reset(input);
 assign(output,'godfarmer.out');rewrite(output)
end;
procedure ouf;
begin
 close(input);close(output)
end;
{procedure left(x:longint);inline;
var y,z:longint;
begin
 y:=rt[x];z:=rt[y];
 if l[z]=y then l[z]:=x else r[z]:=x;rt[x]:=z;
 r[y]:=l[x];rt[l[x]]:=y;
 l[x]:=y;rt[y]:=x;
 maxk[y]:=max(maxk[l[y]],max(maxk[r[y]],key[y]));
 maxk[x]:=max(maxk[l[x]],max(maxk[r[x]],key[x]));
 maxk[z]:=max(m
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值