題解/算法 {\2488. 树套树-简单版}
@LINK: https://www.acwing.com/problem/content/description/2490/
;
線段樹的每個節點 放置一個multiset
;
#查詢操作#
一個自然的想法 就是獲取[l,r]
這個區間的multiset
, 但是 這會超時的! (比如[0,n-1]
你查詢[1,n-2]
這個區間 那麼你會合併兩個n/2
大小的集合 這已經不是log級別了);
所以 需要優化; 我們目標是: 在若干個multiset {s1,s2,s3,...}
裡面 找<ma
的最大數, 你不需要將他們s1,s2,...
合併成一個集合, 她是可以分開來的, 即令si
裡面的<ma
的最大數是ai
(如果沒有 則設置為-INF
), 則最終答案就是max( a1, a2, ...)
;
即query
函數的返回值 並不是Data
類型, 而就是一個int
答案類型;
#單點修改操作#
比如涉及該點的所有節點是n1,n2,...
, 如果你採用常規的遞歸之後 進行Update_bySon
操作, 她是O(N)
的, 即合併兩個集合;
因此 還是要優化, 比如當前區間數組值是[a,b,c,d,e]
你要把他變成[a,B,c,d,e]
, 那麼 如果你全局的維護著底層數組, 就可以得到b
, 於是把b
刪除 然後添加B即可;