題意:在牆上貼海報,海報可以互相覆蓋,問最後可以看見幾張海報。
該題是線段樹區間修改+離散化的應用。
不難想到, 每次對一個最長10^7的線段進行線段樹的區間修改, 最後統計。
線段樹的復雜度是log10^7, 應該不會超時, 但是會超內存。 所以想到要離散化, 將區間端點值有映射成一個盡量小的值。
但是該題求的是覆蓋情況, 如果按照單純的點對點的離散化, 那樣會出現錯誤答案。
例如: 依次貼[1,10], [1,3], [5,10] , 離散化後1->1, 3->2, 5->3, 10->4
那麼第一次讓離散後的區間[1,4]變成1,第二次讓[1,2]變成2,第三次讓[3,4]變成3,那麼最終答案成了2, 其實是3。
問題之所在就在於:小的區間不會覆蓋大區間的所有部分。 解決方法就是在相鄰區間端點大於1時再添加一個二者中間的數當作“空白”區域。
不會離散化的先學學離散化吧, 一般用二分來維護比較簡單。
細節參見代碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include