國慶day1補題

huanghezhe發表於2024-10-29

國慶day1補題

單調資料結構

單調棧的性質:

1.單調棧裡的元素具有單調性

2.元素加入棧前,會在棧頂端把破壞棧單調性的元素都刪除

3.使用單調棧可以找到元素向左遍歷第一個比他小的元素,也可以找到元素向左遍歷第一個比他大的元素,具體的,假設要找到一個元素向前第一個比它大的數,就是維護單調減的單調棧,加入一個數彈到最後時的前面那個數(這個數不再彈出)。向後第一個比它

單調佇列相當於另外又維護了一個下標(或別的)可以從開頭刪除元素

CF280B Maximum XorSecondary

題意:

給出一個長為n的正整數序列。定義一個序列的所有數異或的結果為其最大值和次大值的異或值。求在此序列的所有子串(即要求連續一段區間)中價值最大是多少。

第一行一個整數n(\(1≤n≤10^5\)),表示序列長度。

第二行n個由空格隔開的正整數\(s_i\)((\(1≤s_i≤10^9\))),為序列元素。

輸出僅一個整數,即最大異或和。

題解:

不妨列舉所有可能出現的最大值和次大值,由於若以最大值列舉的話難以計算(因為對應一個最大值的話次大值有很多種可能),所以我們列舉次大值,具體的說就是遍歷陣列 \(a_i\) ,每個數為一個區間次大值時,最大值只可能是前面第一個比這個數大的數或後面第一個比這個數大的數,這樣可以進行單調棧。

容易發現把這個數彈出的數就是第一個它大的數。

CF1407D Discrete Centrifugal Jumps

題意:

\(n\) 個高樓排成一行,每個樓有一個高度 \(h_i\)。稱可以從樓 \(i\) 跳到 樓 \(j\),當 \(i\), \(j\) ( \(i < j\) )滿足以下三個條件之一:

  • \(i+1=j\)

  • \(\max(h_{i+1},h_{i+2},\cdots,h_{j-1})<\min(h_i,h_j)\)

  • \(\min(h_{i+1},h_{i+2},\cdots,h_{j-1})>\max(h_i,h_j)\)

現在你在樓 \(1\),請求出跳到樓 \(n\) 最少要跳幾次。

\(2 \leq n \leq 3\cdot 10^5\), \(1\leq h_i \leq 10^9\)

題解:

顯然dp,考慮如何轉移,第一點顯然是 \(dp[j-1]+1\)\(dp[j]\) 有貢獻,第二項和第三項本質一樣,考慮第二項,意思是中間的所有元素都小於兩邊的這倆元素,假設目前正在計算\(dp[j]\) ,考慮可以從哪個點來轉移,

  • 如果\(h_i\le h_j\),那麼說明\(h_j\)\(h_i\)後第一個比\(h_j\)大或等於的數,這用性質三,用單調遞減的單調棧維護即可,每次有彈出的數都是貢獻的一部分
  • 對於\(h_i > h_j\),著說明了\(i\)只能取 \(j\)之前第一個比 \(j\)大的位置,同樣可以用單調棧來維護

具體來說維護一個單調遞減的單調棧,每次彈出去的所有比\(h_j\)小或等於的數計算貢獻,如果中間沒有彈出等於的數,那麼對前一個數也計算貢獻(因為如果有等於的數,就無法滿足均大於中間的數(注意單調棧中不可能出現兩個等的數,因為單調遞減))。

[ABC352D] Permutation Subsequence

題意:

給你一個 \(1 \sim N\) 的排列 \(P\)

長度為 \(K\) 的索引(位置)序列 \((i_1,i_2,\dots,i_K)\) 如果同時滿足以下兩個條件,則稱為好索引序列

  • \(i\)\(1\)\(K\) 單調遞增。
  • 子序列 \((P_{i_1},P_{i_2},\ldots,P_{i_K})\) 可以在重新排列後成為 \(K\) 個連續的整數。

求所有好的索引序列中 \(i_K-i_1\) 的最小值。可以證明,好索引序列存在至少一個。

題解:

比較容易,可以先做一個對映,記錄\([1,n]\)每個數出現的位置,可以知道我們的這個序列出現於這個對映後的一段長度為\(k\)的連續區間裡,額,求\(i_k-i_1\)的min值,這就是標準的滑動視窗。

CF1195E OpenStreetMap

題意:

給定一個 $ n\times m $ 的矩陣 $ h $ ,求出所有大小為 $ a\times b $ 的子矩形中的最小值的和.

題解:

單調佇列好題,注意二維的轉化,假設我們要求以\((i,j)\)為左上頂點進行討論,考慮這個min值的性質,顯然可以拆成這個a行每一行的min然後再min,於是我們就可以對於這個矩陣每一行進行滑動視窗,得出一個新的矩陣,代表每個數往後\(b\)長度的min值,然後再以縱列做一次滑動視窗,求這a行的min就解決問題了。

貪心

一種很意識流的想法,但對問題進行詳細分析便可得出策略,有兩類常用方法:

  • 歸納法:每一步都保證是最優解
  • exchange argument:交換兩步操作,答案不會更優(簡單來說)

[NOIP2012 提高組] 國王遊戲

題解:

我們考慮交換相鄰的兩個對於結果的影響,假設交換前為\((j,i)\),交換後為\((i,j)\),假設交換後更劣,則:

\[\max(\frac{c}{b'_i},\frac{ca'_i}{b'_j})> \max(\frac{c}{b'_j},\frac{ca'_j}{b'_i}) \]

考慮若要滿足這個式子,則會出現兩種情況:

\[\frac{c}{b'_i}>\frac{c}{b'_j}\& \frac{c}{b'_i}>\frac{ca'_j}{b'_i} \]

\[\frac{ca'_i}{b'_j}>\frac{c}{b'_j}\& \frac{ca'_i}{b'_j}>\frac{ca'_j}{b'_i} \]

兩個都可以進行化簡:

\[b'_j<b'_i\& a'_j<1 \]

\[a'_ib'_i>a'_jb'_j\& a'_i>1 \]

第一種情況因為\(a\)的資料範圍不可能所以捨去,然後就發現我們要滿足\(a'_ib'_i>a'_jb'_j\),這樣如果交換不劣,所以按\(a'_ib'_i\)從小到大排序即可。

CF1552E Colors and Intervals

題意:

\(n \times k\) 個格子,編號從 \(1\)\(n \times k\),染成 \(n\) 種顏色,每種顏色恰好 \(k\) 個。
構造 \(n\) 個區間,第 \(i\) 個區間 \([a_i, b_i]\) 滿足

  • \(1 \le a_i < b_i \le n \times k\)
  • \(a_i\) 個和第 \(b_i\) 個格子的顏色都是 \(i\)
  • 每個格子被包含不超過 \(\lceil \frac{n}{k-1} \rceil\) 次。

題解:

可以有一個妙的想法,構造出來機組劃分,每一組劃分裡面的區間互不相交,每個劃分包含k-1個區間,這樣絕對可以滿足第三個條件。

考慮每一組內該如何考慮:

使用貪心,假設當前已經在這一組中前面的已經劃分出來,後面我們選擇r端點最小的滿足\(c_l=c_r\)的元素,可以證明,一定可以取夠\(k-1\)個區間。、

證明也是妙妙:

可以看luogu題解

倍增

不想寫了

分治

不想寫了