BZOJ3224 普通平衡樹 替罪羊寫法

2021-08-14 11:35:36 字數 1873 閱讀 4323

全機房就剩下me不會替罪羊了=a=

於是去寫了一道板子題…

bzoj3224傳送門

如果你看見了 普通平衡樹,bzoj3224 這樣的字眼,都還想不起來題面的話……

雖然替罪羊 原理簡單 思想粗暴 證明看不懂,不過它的寫法貌似還是不少。

關於刪除操作

主要的差異可能還是在刪除部分。第一種方法是替換刪除法,刪除的時候找到當前點的前驅或者後繼來替換掉它。第二種方法是懶惰刪除法,刪除的時候給它打乙個標記,而不真正的刪除它,等到暴力重構的時候直接捨棄這些有標記的點即可。

關於維護資訊

還有就是節點的資訊,可以合併重複點,也就是在每個節點上都維護cnt,表示這個值出現了多少次,當cnt為0時相當於有了乙個刪除標記。而如果不合併重複點,就需要自帶乙個bool的刪除標記。

還有還有!!因為在子樹重構之後,根到子樹鏈上的資訊並沒有更新,於是me為了保險起見,專門寫了乙個update函式取更新資訊(記錄下重構節點是樹的第幾個節點,然後從根節點往下找)。

關於查詢前驅後繼

為什麼這個也要拿出來單獨說呢?因為這玩意er花了me一上午時間才想清楚…

如果刪除操作用的是替換刪除,那麼就可以直接使用pre和next函式去查詢(也就是類似查詢 左子樹里最右的節點 這樣)。而如果使用的是懶惰刪除,就不能直接使用pre和next函式,因為有可能 左子樹最右的節點 已經被刪掉了….解決辦法是,先得到當前數字在平衡樹里的rank,然後使用查詢第k大的方式去查詢前驅和後繼

真的自帶大常數,這替罪羊還沒有我的splay快= =

不過**長度倒是真的很短…

#include 

#include

#include

using namespace std ;

double antoniewa = 0.7 ;

intn , topp ;

struct

node

int cmp( const int &x )

}*root , *sta[100005] ;

bool is_bad( node *x )

void newnode( node *&x , const int &val )

node **insert( node *&nd , const int &x )

void dfs( node *nd )

node *divide( int lf , int rg )

void update( node *nd , node *aim )

void rebuild( node *&nd )

intrank( node *nd , int x )

}node *kth( node *nd , int k )

void

delete( node *nd , int x ) else

delete( nd->ch[p] , x ) ;

nd->updata() ;

}int main() else

if( opt == 2 )

else

if( opt == 3 ) printf( "%d\n" , rank( root , x ) - 1 ) ;

else

if( opt == 4 ) printf( "%d\n" , ( kth( root , x + 1 ) )->val ) ;

else

if( opt == 5 ) printf( "%d\n" , kth( root , rank( root , x )-1 ) ->val ) ;

else

if( opt == 6 ) printf( "%d\n" , kth( root , rank( root , x+1) ) ->val );

}}

bzoj3224普通平衡樹

您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的...

BZOJ3224 普通平衡樹

題目傳送門 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於...

BZOJ3224 普通平衡樹

您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的...