BZOJ4458 GTY的OJ(樹上超級鋼琴)

2022-05-14 14:36:09 字數 1134 閱讀 9331

點此看題面

大致題意:給你一棵樹,讓你求出每乙個節點向上的長度在\([l,r]\)範圍內的路徑權值和最大的\(m\)條路徑的權值總和。

此題的數列版本,就是比較著名的【bzoj2006】[noi2010] 超級鋼琴一題了。

其實那道題目的思想,完全也可以套到這道題目上。

當然,如果你比較強大,寫主席樹等玄學演算法+資料結構也是可以過的。

首先,我們\(dfs\)一遍,求出\(sum_i\)表示編號為\(i\)的節點到根節點的權值和

考慮預處理出\(rmq_\)表示編號為\(i\)的節點向上長度為\(2^j\)的路徑中最小的\(sum\)

則對於每乙個節點,從它出發能得到的最大值便是\(sum_x-getmin(x,l,r)\),其中的\(getmin\)可以用\(rmq\)實現\(o(logn)\)求解(\(rmq\)是\(o(1)\)的,但由於要找父親,就變成了\(o(logn)\))。

具體實現詳見**。

#include#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

#define ten(x) (((x)<<3)+((x)<<1))

#define ll long long

#define n 500000

#define inf 1e18

using namespace std;

int n,m,l,r;

class fio

inline void write(ll x)

}f;class class_rmqsolver

inline friend bool operator < (key x,key y)

inline friend bool operator < (rmq_data x,rmq_data y)

public:

inline void solve()

f.write(ans);//輸出答案

}}rmqsolver;

int main()

BZOJ 3720 Gty的妹子樹 塊狀樹

題目大意 維護一棵樹,每個點有乙個權值,提供下列操作 1.詢問某棵子樹中有多少個節點的權值大於x 2.修改某個節點的權值 3.增加乙個葉子節點 傳說中的樹分塊 首先dfs,對於每個節點,如果這個節點的父親節點所在塊未滿,就塞進父節點所在塊中,否則自成一塊,然後與父節點所在的塊連邊 新增節點同理 然後...

bzoj3720 Gty的妹子樹 樹分塊

題目鏈結 題解 按dfs序樹分塊的模板題。每個節點的子樹在dfs序中一定為一串連續的區間,那我們對dfs序分塊就行了,每個塊內元素按大小排序。查詢時暴力找邊界上的塊,中間的塊二分一下。修改時暴力維護大小順序,插入時插在它的父親後 dfs序為它的父親 1 然後暴力修改當前塊的dfs序。複雜度o n n...

BZOJ3720 Gty的妹子樹 樹分塊

我曾在弦歌之中聽過你,檀板聲碎,半出折子戲。舞榭歌台被風吹去,歲月深處尚有餘音一縷 gty神 xian 犇 chong 從來不缺妹子 他來到了一棵妹子樹下,發現每個妹子有乙個美麗度 由於gty很哲 學,他只對美麗度大於某個值的妹子感興趣。他想知道某個子樹中美麗度大於k的妹子個數。某個妹子的美麗度可能...