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\):情況二的臨時答案(不滿足限制)。