因為需要用到區間修改,所以該用splay(尚未填坑)或者無旋treap(剛剛填上)
最開始的建樹用到了建笛卡爾樹的方法,把id大於當前點的點不斷出棧,又因為這道題的點是按序入棧的,所以當它無法讓更多點出棧時,他就是棧首的右子樹,而最後乙個出棧的點,就是當前點的左子樹。顯然root=zhan[1]。
#include#include#include#include#include#define inf 10000000using 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 紅黑樹,特別快 替罪羊樹,朝鮮樹 晚上要講的不旋轉平衡樹 節點的左兒子中的每乙個一定比他小,右兒子中的...