點此看題面
大致題意:給你一棵樹,讓你求出每乙個節點向上的長度在\([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的妹子個數。某個妹子的美麗度可能...