bzoj3720 GTY的妹子樹 塊狀樹模板

2021-08-20 01:57:44 字數 2676 閱讀 1662

圓方樹上塊狀果,點分樹下你和我,虛樹下面做遊戲,仙人掌上歡樂多

這道題題目很長

大概說的是:

要求你寫出乙個資料結構,維護一顆帶點權的樹,茲瓷:

~~ 1. 單點修改點權

2. 查詢子樹內點權大於x的點的個數

3. 新給出乙個點,並將這個點與已有點做link

~~似乎以前學過的任何資料結構都不能做這麼奇怪的事情呢

我們的塊狀樹就閃亮登場啦

我們對一棵樹進行分塊

然後就可以用vector維護了

我們大概可以把vector封裝成這樣的東西

struct block_chain

inline

void ordered()

inline

int size()

inline

void insert(int x)

inline

void modify(int x,int y)

inline

void print()

inline

int solve(int x)

inline

void order_insert(int x)

};

這就是乙個非常好用的容器了

那我們如何分塊呢?

我們將每block個點放在乙個塊鏈裡。

並且將這些塊鏈連成一棵新的樹

易知乙個點的子樹裡所有的點要不是和根在同一塊裡,要不就是其所在塊整塊都在子樹中

void build_block(int u,int father)

else

fa[u]=father;

for(register int i=head[u];i;i=e[i].nxxt)

}

這樣就可以重建一顆塊狀樹了

查詢時分情況討論

如果在同乙個塊裡,則暴力乙個乙個查詢

如果不在乙個塊裡,就整塊查詢

link時原圖link,塊狀樹也要link

貼**

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=60010;

#define fastcall __attribute__((optimize("-o3")))

#define il __inline__ __attribute__((always_inline))

fastcall il char nc()

template

fastcall il void read(t &x)

while(isdigit(c))s=(s<<3)+(s<<1)+c-'0',c=nc();

x=s*w;

}inline

void write(int x)

struct edge

e[maxn<<2],blo[maxn<<2];

struct block_chain

inline

void ordered()

inline

int size()

inline

void insert(int x)

inline

void modify(int x,int y)

inline

void print()

inline

int solve(int x)

inline

void order_insert(int x)

}a[maxn];

int head[maxn],cnt,blo_head[maxn],blo_cnt,belong[maxn],a[maxn],fa[maxn],block,now;

int n,m,opt;

inline

void add(int x,int y)

inline

void blo_add(int x,int y)

inline

void update(int u,int x)

void build_block(int u,int father)

else

fa[u]=father;

for(register

int i=head[u];i;i=e[i].nxxt)

}int block_query(int u,int x)

int solve(int u,int x)

return ans;

}int lastans;

int main()

for(register

int i=1;i<=n;i++)read(a[i]);

read(m);

block=ceil(sqrt(n+m));

build_block(1,0);

for(register

int i=1;i<=now;i++)a[i].ordered();

while(m--)

}}

效率還行

luogu需要吸氧才能ac

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

BZOJ3720 Gty的妹子樹

如果沒有插入操作,那麼直接對dfs序建立線段樹套平衡樹即可,有插入操作的話,將外層的線段樹換成重量平衡樹即可。一開始寫替罪羊樹套權值線段樹無限mle 所以只好寫替罪羊樹套treap include include includeusing namespace std typedef unsigned...

BZOJ3720 Gty的妹子樹

題目 題解 傳說中的塊狀樹。和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?被菊花卡死?然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t t 還是老老實實寫線性表吧。塊開s...