無旋treap 文藝平衡樹

2022-03-27 08:10:57 字數 942 閱讀 6648

因為需要用到區間修改,所以該用splay(尚未填坑)或者無旋treap(剛剛填上)

最開始的建樹用到了建笛卡爾樹的方法,把id大於當前點的點不斷出棧,又因為這道題的點是按序入棧的,所以當它無法讓更多點出棧時,他就是棧首的右子樹,而最後乙個出棧的點,就是當前點的左子樹。顯然root=zhan[1]。

#include#include#include#include#include#define inf 10000000

using namespace std;

int n,m;

struct treap

inline void update()

} *null=new treap(),*root=null,*zhan[100005],*x,*last;

typedef paird;

inline int read()

while(x>='0'&&x<='9')

return sum*f;

}inline treap* newtreap(int x)

void push(treap *f)

}d split(treap *f,int k)

else

return y;

}treap* merge(treap *a,treap *b)

else

}void dfs(treap *x)

int yjn()

if(p)zhan[p]->ch[1]=x;

x->ch[0]=last;zhan[++p]=x;

} while(p)zhan[p--]->update();

root=zhan[1];

int l,r;

for(int i=1;i<=m;i++)

dfs(root);

}int qty=yjn();

int main()

P3391 模板 文藝平衡樹 (無旋treap)

用可以提取區間的平衡樹,對區間整體打標記,先不下放,等到操作涉及這個節點時再下放 交換左右兒子並給左右兒子打標記 我用的是無旋treap 剛開始需要建樹,建樹模仿笛卡爾樹,由於所有元素出棧之後自身的兒子不會再有變化,因此出棧的時候再push up即可,由於棧維護右鏈,棧頂就是root 要看splay...

BZOJ3223 文藝平衡樹 無旋Treap

time limit 10 sec memory limit 128 mb 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 第一行為n,m n表示初始序列有n個數,這...

平衡樹之非旋Treap

線段樹不支援插入or刪除乙個數於是平衡樹產生了 常見平衡樹 treap 比sbt慢,好寫吧 sbt 快,比較好寫,有些功能不支援 splay 特別慢,複雜度當做根號n來用,功能強大,不好寫 rbt 紅黑樹,特別快 替罪羊樹,朝鮮樹 晚上要講的不旋轉平衡樹 節點的左兒子中的每乙個一定比他小,右兒子中的...