BZOJ3720 Gty的妹子樹(樹上分塊)

2021-08-17 10:26:24 字數 1045 閱讀 9977

我是超連結

樹上分塊,以一種新的姿勢寫的,似乎優越?

對於分塊我們只需一遍dfs,只要當前節點的父節點的塊的大小大於sqrt(n)就自成一塊

我們記錄每個節點所屬的塊,建立兩個圖,乙個圖存原樹,乙個圖存塊的連通性

我們維護塊內的元素有序,這樣查詢時可以二分

因為我們是根據父節點來分塊的,所以不會有「遙遠的節點」在當前節點的父節點所在塊內

即如果乙個節點是第乙個加入塊的,那麼不會有別的子樹的節點屬於這個塊

那麼我們在查詢乙個子樹時,只需要從子樹的根開始向下遍歷,先處理這些不在完整塊內的點

一旦我們碰到了別的塊內的點,就立即轉移到塊的圖上去跑

#include 

#include

#include

#include

using namespace std;

const int n=60005;

int tot,nxt[n*2],point[n],v[n*2],tot1,nxt1[n*2],point1[n],v1[n*2],pos[n],ans,block,cnt,a[n],f[n];

struct block

void change(int

x,int

y)

int qurry(int

x)

}b[n];

void addline(int

x,int

y)void addline1(int

x,int

y)void dfs(int

x,int fa)

void findk(int

x,int

y)void find(int

x,inty)}

int main()

for (int i=1;i<=n;i++) scanf("%d",&a[i]);

block=sqrt(n);dfs(1,0);

scanf("%d",&m);

while(m--)}}

}

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...