一般的最长上升子序列是二维偏序,所以排序后用线段树维护可以达到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