給定一棵 \(n\) 個點根為 \(1\) 單位權值的樹以及 \(q\) 個查詢, 每次查詢給定 \(p\) 和 \(k\), 求滿足 \(a,p\) 都是 \(b\) 的祖先且 \(a,p\) 之間的距離不超過 \(k\) 的 \((a,b)\) 的數量. (\(a,b,p\) 不能重合)
\(n,q\le3\times 10^5\).
首先我們一眼就能看出這個鬼東西需要分 \(a\) 是否是 \(p\) 的祖先來計算. 如果 \(a\) 是 \(p\) 的祖先那麼會對應 $size_p-1 $ 個不同的 \(b\). 否則的話對於每個深度與 \(p\) 之差不超過 \(k\) 且在 \(p\) 子樹中的 \(a\) 都會對應 \(size_a-1\) 個不同的 \(b\).
前一部分感覺地球人都知道怎麼做. 問題在於後一部分要求某個子樹中深度在某一區間內的點的權值和.
區間查詢, 不難想到線段樹. 然後我們發現事實上祖先結點可以繼承子結點的權值和資訊, 於是我們用線段樹合併處理.
時間複雜度是 \(o((n+q)\log n)\).
BZOJ3653 談笑風生
對於每乙個詢問我們可以提出 ans min dep u 1,k size u 1 u子樹中到u距離 k的節點的子樹節點和 顯然後面那個東西是可以用可持久化線段樹搞得 好了 include include include include using namespace std char c defin...
BZOJ3653 談笑風生
題目大意 給一棵樹,每次詢問給定a,k,求三元組 a,b,c 的數量滿足 1.a和b都是c的祖先 2.a和b在樹上距離不超過k 3.a,b,c互不相同 顯然abc肯定形成豎著的一條鏈 分兩種情況討論 1.b在a的上方,也就是說對於任意合法的b,c可以在a的子樹裡隨便選,這個方案數是可以直接算出來的 ...
BZOJ 3653 談笑風生
題目在這裡呀!個人認為是一道很好的題目,原來可持久化線段樹還能這麼用,看題解之前還是沒有想到啦要批評!那就寫個題解補償一下?給你一棵有根樹,n個節點,有q次詢問,每次詢問,給出兩個數x 1 x n d,求有多少有序元組 y,z 滿足 x,y,z互不相同,x,y均為z的祖先,且x,y之間的距離超過d。...