挖坑 資料結構的題

2022-09-23 21:06:19 字數 4506 閱讀 8436

連邊、刪邊;單點點權修改;查詢路徑點權xor和。

裸lct。

單邊邊權修改;路徑邊權覆蓋/加某常數;查詢路徑邊權max。

雙標記(note:覆蓋和加的雙標記可以轉化為乘和加的雙標記,即乘0或1後再加某值)。裸lct/樹鏈剖分。

換根;單點點權修改;查詢子樹點權min。

線段樹維護dfs序。

至於換根操作,不用真的換。設原先的根為1,現在的根為rt,要求詢問子樹u。討論三種情況(1)rt==u(2)u是rt的(真)祖先(3)其他,看「子樹u」到底是哪一部分。其中要用到倍增。

換根;路徑點權覆蓋;查詢子樹點權min。

樹鏈剖分、dfs序。

對某個點dfs的時候優先沿其重邊往下走,這樣得到的dfs序中,每條重鏈都是連續一段出現的,從而可以支援鏈修改。

換根的處理方法同3306。

初始時為一棵森林,需要支援連邊;查詢路徑點權第k小。(強制**)

啟發式合併、主席樹。

先離散化。給每棵樹定乙個根開始dfs。dfs時建好根到每個結點的權值線段樹(權值事先離散化),同時處理出倍增陣列用於求lca。

連邊(u,v)時,tu和tv被合併,不妨設size(tu)>=size(tv),那麼把v接到u下面成為其孩子,然後往下對tv進行dfs,重構權值線段樹以及倍增陣列。複雜度是o(logn*size(tv))的。

最後總複雜度是o(nlog^2n)。簡證:考慮任意某個元素,其對複雜度作出貢獻時一定屬於兩樹中較小的一棵,合併後它所在的樹大小至少是兩倍,於是不超過logn次。

單點點權修改;查詢路徑點權第k小。

法①:dfs括號序、樹狀陣列套主席樹。

dfs括號序中,左括號為插入(次數+1),右括號為刪除(次數-1)。從而根到每個結點的路徑可以轉化為乙個字首和。u到v的路徑可以表示成t(u)+t(v)-2*t(x)+x,其中x=lca(u,v)。於是可以用主席樹。為支援修改需用樹狀陣列套。

查詢o(log^2n),修改o(log^2n),空間o(nlog^2n)。

法②:dfs括號序、線段樹套平衡樹。

最外層對權值建一棵線段樹,每個線段樹結點對應一棵儲存下標的平衡樹。把left[u]、right[u]插到包含w[u]的線段樹結點所對應的那些平衡樹中去。平衡樹結點需維護size域,並且把right[u]結點的size標為-1。

查詢時只要在最外層線段樹二分。

(線段樹用樹狀陣列代替也可)

查詢o(log^2n),修改o(log^2n),空間o(nlogn)。

n個點,形成乙個樹狀結構。有m次發放,每次選擇兩個點x,y對於x到y的路徑上(含x,y)每個點發一袋z型別的物品。完成所有發放後,每個點存放最多的是哪種物品。

樹鏈剖分。

先考慮是一條鏈上的情況,把所有發放的左端點記為+1(表示放入),右端點記為-1(表示取出),放到一起排序。然後從左到右掃瞄,掃的同時用乙個堆/線段樹來維護目前的物品集合,遇到+1或-1就相應地更新集合。掃完就能得到所有答案。

剖完以後,每次發放就被拆成了logn次在重鏈內的發放。每條重鏈分別統計答案即可。

莫隊。把序列均勻分為m段。對詢問排序時優先按左端點所在段的編號公升序,若左端點處於同一段內的,再按右端點公升序排。這樣左端點移動了o((n/m)*q),右端點移動了o(m*n)。

m取o(sqrt(n))。

詢問區間逆序對數量。

莫隊。樹狀陣列維護當前區間內所有權值及出現次數,同時維護逆序對數量。

單點修改;查詢區間最大連續子段和。

線段樹。

每個結點維護4個域,權值和、左端點為起始的最大子段和、右端點為結束的最大子段和、不加限制的最大子段和。於是線段樹里可以方便地合併兩個兒子節點。

splay/塊狀鍊錶的自虐題。

詢問區間內最大連續子段xor和。(強制**)

分塊、函式式trie。

求字首和,轉化成求兩個元素xor和的最大值。

每個數看成二進位制01串。從1到n依次插入建成函式式trie。時間o(nloga)。

序列均勻分成m段。預處理:通過m次掃瞄整個序列,對每一對1<=i<=j<=m,求出第i段到第j段內的答案ans[i][j]。時間o(nmloga)。

詢問:找出包含在l,r內的完整的段i,i+1,……,j,若所求區間端點在這些段內,答案即是ans[i][j]。若區間某個端點(或兩個都)在這些段以外,暴力列舉。完整段外的零頭是o(n/m)級別,所以複雜度o((n/m)*loga)。

取m=o(sqrt(n))。

(加一減一之類的細節要當心)

區間權值覆蓋;插入單個元素;區間加等差數列;詢問區間和。

splay。

覆蓋和插入不用多說,關鍵在於等差數列的處理。結點的標記a,d表示對該區間加了等差數列a,a+d,…,a+(size-1)d。標記容易合併:a+a』,a+d+a』+d』,…,a+(size-1)*d+a』+(size-1)*d』相當於a+a』,(a+a』)+(d+d』),…,a+a』+(size-1)(d+d』)。

標記也容易下傳,乙個等差數列斷成的兩截仍是等差數列。

詢問區間內權值的mex。

離線。從1到n列舉區間右端點i,同時維護一棵權值線段樹。線段樹的葉子節點x儲存1<=j<=i且a[j]==x的最大j(x未出現過就記j=0),線段樹內部結點儲存它下面的葉子的值的min。掃到i時更新線段樹里a[i]處的值。然後回答以i為右端點的詢問,用左端點去比較並沿著線段樹根下降到葉子即為答案。

查詢區間內出現次數為正偶數的權值有幾種。(強制**)

分塊。法①:

將序列均勻分成m段,預處理a[i][j]表示前i段中,權值j的出現次數。o(nm)。

預處理b[i][j]表示第i段到第j段(i<=j)內的答案。

查詢時,找出包含在l,r內的完整的段i,i+1,…j,於是我們有第i到j段的答案b[i][j]以及其中任意權值x的出現次數a[j][x]-a[i-1][x]。再把段外的零頭的權值插入(cnt++),插入時維護答案的變化。每次查詢複雜度o(n/m)。(記得查詢完後把插入的值刪掉)

取m=sqrt(n),於是總時間o((n+q)sqrt(n)),空間o(nsqrt(n))。(空間不是很靠譜)

法②:o(nm)預處理b[i][j]表示第i段到第j段(i<=j)內的答案。

對每個權值x建乙個序列,按公升序儲存所有滿足a[i]=x的下標i。

查詢時,找出包含在l,r內的完整的段i,i+1,…j,於是我們有第i到j段的答案b[i][j]。把段外零頭出現過的權值挑出來,對於其中某一種權值,可以在其下表序列中二分,求得它在區間l,r內出現的次數,再討論其奇偶性對答案的影響,更新答案。每次查詢的時間是o(n/m * logn)。

取m=o(sqrt(n)),總時間大概是o((n+q)sqrt(n)log(n))的樣子,空間是o(n)的。

維護乙個矩陣,每次詢問某個子矩陣的第k小數。矩陣邊長500,詢問次數6萬。

整體二分。

把所有格仔按權值公升序排。離散化權值後,設當前二分的權值範圍是[l,r],此範圍內的詢問集合是q。

若l==r,那麼q內所有詢問的答案就是l對應的權值。

否則,1)給權值在[l,mid]範圍內的格仔加一(用二維樹狀陣列維護)。

2)對q內的每個詢問,用二維樹狀陣列統計後看各自的k值是否達到,並依此將q分成q1,q2。

3)遞迴處理[mid+1,r],詢問集合為q2。

4)給權值在[l,mid]範圍內的格仔減一

5)遞迴處理[l,mid],詢問集合為q1。

若邊長為a,權值總數為o(a^2)。排序複雜度為o(a^2loga^2)=o(a^2loga)。

每個詢問出現在o(loga^2)=o(loga)層,每次查詢o(log^2a),所以步驟2)的複雜度總共o(qlog^3a)。

剩下的複雜度t(n)=2t(n/2)+o(n*log^2a)=o(nlognlog^2a)。

所以總複雜度o(a^2loga)+o(qlog^3a)+o(a^2*loga^2*log^2a)=o((a^2+q)log^3a)。

維護乙個矩陣(初始為空)。修改某格權值;查詢某個子矩陣的權值和。矩陣邊長200萬,修改次數16萬,詢問次數1萬。

cdq分治。

所有修改和詢問按時間順序組成乙個操作序列t。處理t[1..n]即可。

處理t[l..r]時:

1)遞迴處理左半部分t[l..mid]。

2)統計t[l..mid]中修改對t[mid+1..r]中詢問的貢獻。

不妨設所有詢問矩陣的x1都是1(否則寫成兩個這樣的矩陣的差)。將左半部分的修改和右半部分的詢問放在一起,按照x(修改操作按照x2)公升序排序,若x相同則修改在前詢問在後。然後x從1開始掃,掃的同時維護y軸上的一棵樹狀陣列,並相應進行修改/查詢,並把求得的貢獻值累加到該詢問的答案上。

3)遞迴處理右半部分t[mid+1..r]。

設矩陣邊長為a,t(n)=2t(n/2)+o(nlogn)+o(nloga)=2t(n/2)+o(nloga)=o(nlognloga),離散化後即是o(nlog^2n)。

同1176。

給定n個三元組(a,b,c),對每個三元組統計滿足a』<=a,b』<=b,c』<=c的(a』,b』,c』)的數量。

cdq分治。

關 鍵在於等號的處理。按a排序,並把a值相同的三元組放到乙個段內。cdq分治時以段為最小單位,這樣每次將序列分成兩部分時,可以保證左半部分的a都嚴格 小於右半部分的a,於是我們可以統計a』

資料結構題

題目背景 把一張紙對折100次就和珠穆朗瑪峰一樣高了哦 syh 題目描述 注 本系列題不按難度排序哦 第一行乙個n,m 接下來一行n個數表示a i 接下來m行,每行l,r,l1,r1,x,表示求get l,r,x get l1,r1,x 輸出描述 3 m行,先輸出get l,r,x 再輸出get l...

資料結構題

題目背景 把一張紙對折100次就和珠穆朗瑪峰一樣高了哦 syh 題目描述 注 本系列題不按難度排序哦 第一行乙個n,m 接下來一行n個數表示a i 接下來m行,每行l,r,l1,r1,x,表示求get l,r,x get l1,r1,x 輸出描述 3 m行,先輸出get l,r,x 再輸出get l...

BST資料結構題

給定bst。改動bst,使得每乙個點都是大於他的結點的值之和 關鍵是這題遞迴引數怎麼設計,每乙個點比他大的有兩快。乙個是右子書 假設有的話 還有乙個是祖先裡面比他大的,假設直接用這兩個的話,找不到遞迴結構。應該設計第乙個引數是祖先比他大的節點和,第二個引數是子樹的和。包含自身。struct node...