做了一下可持久化資料結構。
總結一下。
2.影魔
好久以前的題了。
現在才會。
要求兩種貢獻必須都要被統計。
考慮線段樹掃瞄線。
首先用單調棧維護出左右離這個數最近的大於這個數的數的位置,得到區間\([l_i,r_i]\)
那麼有三種貢獻:
\[[l_i,r_i],p1
\]\[l_i和[i+1,r_i-1],p2
\]\[[l_i+1,i-1]和r_i,p2
\]對於第一種貢獻,在掃瞄到\(r_i\)的時候加入在\(l_i\)上。
第二種和第三種都在掃瞄到定點的時候把貢獻加入在區間上。
這樣對於乙個詢問\([l_i,r_i]\)
重點在於區分統計答案的位置。
3.世博會
這個題能想到我覺得還是挺爽的。
就是切比雪夫距離轉化為曼哈頓距離。
我們旋轉座標系變為菱形就可以做了。
轉化座標之後用主席樹找到中位數是誰,就可以直接得到答案了。
4.obserbing the tree樹上詢問
裸的可持久化樹剖。
考慮區間加乙個等差數列怎麼搞。
對於左側區間是加入原等差數列,右側的話只需要改變首項即可,而兩個等差數列相加只需要相加首項和公差。
我們這樣以來發現要打懶標記,那麼用標記永久化實現,如果修改區間是子區間,那麼不改變懶標記,只在當前區間加上等差數列的和。
查詢的時候將路上的標記全部累加入答案,並且將子區間的改變的和累加入答案即可。
回溯只需要改變基態。
本來早就\(ac\)了,結果對拍打錯了調了半天。
5.alo
這個題用\(set\)和可持久化\(trie\)來維護。
我們考慮某個次大值可以作為次大值更新答案的區間。
就是這個數的位置-1到左側第二個大於他的數的位置+1
還有就是這個數的位置+1到右側第二個大於他的數的位置-1
這樣我們先\(sort\)所有的數,然後將位置加入\(set\)中,然後從中找到兩側的區間端點,在\(trie\)中查詢,更新答案即可。
難點在於如何找到答案的統計方法。
6.最大異或和
lyd原題,直接可持久化\(trie\)維護就行了。
可持久化資料結構
1.可持久化線段樹 可持久化陣列 最基礎的可持久化資料結構,每次修改開新的log個點即可。includeusing namespace std const int n 1e6 100 templatevoid rd t x templatevoid print t x struct segseg n...
可持久化資料結構
用vector實現可持久化 這題要求的是乙個支援區間查詢的可持久化資料結構。這裡使用vector巧妙地實現 pair用pair儲存時間戳以及當前時間的值,query的時候使用二分查詢即可。如下 1 include2 include3 include4 include5 define x first ...
可持久化資料結構維護可持久化陣列
首先我們要知道,undo 操作,也就是直接跳回前面的操作 歷史操作 然後跳回的地方到現在的地方這乙個區間的操作都不用管。這就是高階挑戰的思路 可持久化是指一種可以訪問歷史版本的資料結構 然後我們就可以知道,詢問歷史,又是陣列,也就是可持久化陣列。可持久化陣列的維護很簡單,我們可以開乙個 o n 2 ...