[2021.1.27多校省选模拟10]跑步(线段树合并)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                [2021.1.27多校省选模拟10]跑步(线段树合并)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                [2021.1.27多校省選模擬10]跑步
 經典的樹上啟發式合并題目,維護對應子樹的從當前點到子樹內一個節點這個鏈待定,其他部分已經確定的方案數,這個東西按照對應點到根節點的路徑點權和為下標存在一個權值線段樹中,然后維護這個權值線段樹可以線段樹合并。
然后考慮如何統計鏈完全匹配完成時的方案數,我們可以考慮每次合并前查詢答案,相當于是對一段后綴進行詢問權值和,可以進行線段樹上二分,因為我們要求權值和大于等于0。然后先詢問再合并,這樣可以保證任意兩個鏈都會被統計到,這個套路還是比較常見的,而且這樣的復雜度就變成了O(nlognlogn)因為輕兒子總共的大小是O(nlogn)級別的,然后我們還需要對于每個點進行線段樹上二分所以一共有兩個log。
細節要注意我們這里處理每次繼承重兒子的線段樹,然后可以暴力枚舉其他輕兒子,然后合并的時候對應的權值需要進行修改,因為一個鏈的貢獻應該是除了這兩個兒子之外其他兒子的方案數乘積,然而我們查詢時對應的子樹是不同的,但是我們發現對于還未加入的輕兒子都會要乘,所以我們只需要每次維護每個點為已經加入的其他輕兒子的權值乘積,這個可以通過維護乘法標記處理。
然后還有一點細節就是對于單獨的鏈不是合并形成的鏈需要處理,對于輕兒子可以一開始把當前節點加入權值線段樹,之后就會計算,對于重兒子需要特殊處理一下就好。
最后再特殊處理當前一個節點作為鏈的貢獻即可。
總結
以上是生活随笔為你收集整理的[2021.1.27多校省选模拟10]跑步(线段树合并)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何用中医治疗痘痘
- 下一篇: 六味地黄丸可以治疗脱发吗
