總結 可持久化資料結構

2022-03-26 02:50:21 字數 1111 閱讀 1527

做了一下可持久化資料結構。

總結一下。

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 ...