BZOJ3720 Gty的妹子樹 樹分塊

2022-02-27 19:20:46 字數 2502 閱讀 5443

我曾在弦歌之中聽過你,

檀板聲碎,半出折子戲。

舞榭歌台被風吹去,

歲月深處尚有餘音一縷……

gty神(xian)犇(chong)從來不缺妹子……

他來到了一棵妹子樹下,發現每個妹子有乙個美麗度……

由於gty很哲♂學,他只對美麗度大於某個值的妹子感興趣。

他想知道某個子樹中美麗度大於k的妹子個數。

某個妹子的美麗度可能發生變化……

樹上可能會出現乙隻新的妹子……

維護一棵初始有n個節點的有根樹(根節點為1),樹上節點編號為1-n,每個點有乙個權值wi。

支援以下操作:

0 u x 詢問以u為根的子樹中,嚴格大於x的值的個數。(u=lastans,x=lastans)

1 u x 把u節點的權值改成x。(u=lastans,x=lastans)

2 u x 新增乙個編號為"當前樹中節點數+1"的節點,其父節點為u,其權值為x。(u=lastans,x=lastans)

最開始時lastans=0。

輸入第一行包括乙個正整數n(1<=n<=30000),代表樹上的初始節點數。

接下來n-1行,每行2個整數u,v,為樹上的一條無向邊。

任何時刻,樹上的任何權值大於等於0,且兩兩不同。

接下來1行,包括n個整數wi,表示初始時每個節點的權值。

接下來1行,包括1個整數m(1<=m<=30000),表示操作總數。

接下來m行,每行包括三個整數 op,u,v:

op,u,v的含義見題目描述。

保證題目涉及的所有數在int內。

對每個op=0,輸出一行,包括乙個整數,意義見題目描述。

1 210 20

0 1 5

2017.9.28新加資料一組by gxzlegend,未重測

這就是傳說中的樹分塊? get到了

我們從1【根節點】開始加入塊中,若當前節點u的父親所在塊容量沒滿,那麼加入父親的塊中,否則新開一塊

這樣一來,塊內元素數量的平衡,每對相鄰節點之間,要麼屬於同一塊,要麼是各自塊之間的唯一介面

對於塊內,我們可以暴力維護排序,每次查詢塊內大於k的個數直接二分【事實證明暴力並非正解,在洛谷會被卡2個點】

對於每次查詢,我們只需要從該節點出發往下,對於同乙個塊的直接暴力統計,不同塊的直接查詢,

對於原樹我們再將所有塊縮點建一棵新樹,每次查詢時到達新塊時就直接換到新圖上跑

總的複雜度\(o((n + m)\sqrtlog\sqrt)\)有點懸。。

#include#include#include#include#include#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define redge(u) for (int k = h[u],to; k; k = ed[k].nxt)

#define bug(s,n) for (int i = 1; i <= (n); i++) cout<57)

while (c >= 48 && c <= 57)

return out * flag;

}int n,m,t;

struct block

void insert(int x)

int query(int x)

return a[siz] > x ? siz - l + 1 : 0;

}void modify(int x,int v)

}int i = l;

a[i] = v;

while (i > 1 && a[i] < a[i - 1]) a[i] ^= a[i - 1] ^= a[i] ^= a[i - 1],i--;

while (i < siz && a[i] > a[i + 1]) a[i] ^= a[i + 1] ^= a[i] ^= a[i + 1],i++;

}}block[maxn];

int fa[maxn],val[maxn],b[maxn],bi,ans;

int h[maxn],ne = 2,hb[maxn],nb = 1;

struct edgeed[2 * maxn],e[2 * maxn];

void build(int u,int v); h[u] = ne++;

ed[ne] = (edge); h[v] = ne++;

}void add(int u,int v); hb[u] = nb++;

}void dfs(int u)

redge(u) if ((to = ed[k].to) != fa[u])

}void dfs2(int u,int v)

void dfs(int u,int v)

}int main()

else if (opt & 1) block[b[u]].modify(val[u],v),val[u] = v;

else

}return 0;

}

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