反悔貪心

xishanmeigao發表於2024-10-25

P2107 小Z的AK計劃

建議直接暴力,路上取 max 即可。

想太複雜了,WA 了一個點。

P1484 種樹

經典題。

明明已經跟時間無關了不知道我為啥還硬要從左到右列舉。

考慮先取出最大的,再反悔。設位置為 \(i\)

如果要取 \(a_{i-1},a_{i+1}\),那肯定是同時取,所以可以直接將 \(a_{i-1},a_i,a_{i+1}\) 從堆裡刪除,然後再插入 \(a_{i-1}+a_{i+1}-a_i\)

具體實現可以用連結串列。

反思:不能先入為主;學習費用提前計算的技巧。

[AGC018C] Coins

一道經典的模擬費用流題目。

先強制每個人選一個種類,然後考慮反悔。

發現反悔只有 \(5\) 種型別。

a->b b->c c->a  
a->c c->b b->a  
a->c c->a  
a->b b->a  
b->c c->b

於是我們直接拿六個堆模擬這個過程。

為什麼反悔貪心會比直接費用流快???

反悔次數是 \(\mathcal{O}(n)\) 次。

CF802O April Fools' Problem (hard)

可以建立費用流模型,隱約感覺是模擬費用流。

考慮這個費用流模型的本質是什麼,其實是括號序列問題。

原問題的一種方案肯定可以對應一種合法括號串,記左括號為 \(-1\),右括號為 \(1\),構造一個長度為 \(n\) 的字首和序列 \(s\)。現在我們放 \(k\) 次括號,要求括號序列合法,並且代價最小。

每次就兩種方法,\(()\) 或者 \()(\)

第一種簡單,直接找 \(i\le j\)\(a_i+b_j\) 最小的就好了,線段樹很好維護。

第二種有特殊限制,要求左括號所在的位置 \(\forall k\in [i,j)\)\(s_k>0\)

因為存在區間減法,維護 \(0\) 的位置是不方便的,所以我們轉化一下,記 \(a_0=b_0=+\infty\),顯然 \(s_0=0\)。於是我們轉化成 \(s_k\) 必須滿足大於最小值,這是比原先方便的。

對於區間 \([l,r]\),我們維護:

  • \(ma,mb\)\(a_{ma},b_{mb}\) 是區間 \([l,r]\) 的最小值。

  • \(mn\)\([l,r]\)\(s\) 序列的最小值。

  • \(la,lb\)\([l,la),[lb,r]\) 是滿足區間內所有的數都大於最小值的前字尾。且要求 \(a_{la},b_{lb}\) 最小。

  • \(va\):情況一的答案。

  • \(vb\):情況二的答案。

  • \(vc\):情況二的臨時答案(不滿足限制)。

相關文章