1. 程式人生 > >多次查詢一段區間內有多少個子區間滿足其中一個端點為區間最大值。

多次查詢一段區間內有多少個子區間滿足其中一個端點為區間最大值。

預處理 如果 哪些 class 每一個 祖先 href 貢獻 http

考慮維護出每一個點左邊第一個比它大的位置,右邊同理,這樣有一個合法區間。
然後對詢問離線,由於要求只包含區間內的貢獻,掃描線+線段樹解決。

T1
http://codeforces.com/problemset/problem/1117/G
考慮一下笛卡爾樹,然後分析出答案等於這個區間形成的笛卡爾樹的所有節點的子樹和。
再做一步轉化就等價於有多少個節點存在祖先與後代的關系。
這個又等價於最開始的那個問題。

T2
https://www.luogu.org/problemnew/show/P3722
題意轉化出來是:
一個端點為最大值,另一個端點是次大值貢獻為p1。
一個端點為最大值,另一個端點不是次大值貢獻為p2。
考慮先把所有有一個端點為最大值得區間全部記貢獻為p2。
然後由於條件1和條件2的第二部分是互補的,只需要修改一部分貢獻為p1即可。(如果不是互補的,你只改一部分另一部分還會包含不合法的。)
如果考慮去找以x為最大值,哪些位置可以為次大值並不容易。
考慮反向操作,找以x為次大值,哪些位置可以為最大值。
這個顯然就只有兩個位置。(也就是之前預處理出來的左/右第一個比它大的位置)
同樣的方法用線段樹維護即可。

多次查詢一段區間內有多少個子區間滿足其中一個端點為區間最大值。