[筆記] 帶悔貪心
阿新 • • 發佈:2022-03-03
簡介
貪心的侷限性在於其只滿足當前的最優,無法保證全域性的最優,一般此時就會選擇 DP ,但是有的情況,可以通過加入“反悔”操作來保證正確性。
同時,帶悔貪心又名模擬費用流,原因是有的問題可以使用費用流解決,但是費用流的複雜度過高,由於圖的特殊性,分析出可以帶悔貪心。
同時,有些較為複雜的帶悔貪心題目也許可以使用 wqs 二分以時間多一個 \(\log\) 的代價解決。
題目
P1792 [國家集訓隊]種樹
選了位置 \(x\),若反悔,肯定是選上兩邊 (因為反悔,有些位置逐漸繫結在一起,兩邊的概念在變化)
lfor(i, 1, m){ while(ban[Q.top().se]) Q.pop(); int x = Q.top().se; Ans += Q.top().fi, Q.pop(); ban[l[x]] = ban[r[x]] = 1; a[x] = a[l[x]] + a[r[x]] - a[x], Q.push({a[x], x}); l[x] = l[l[x]], r[x] = r[r[x]]; r[l[x]] = x, l[r[x]] = x; }
YZOJ4977 跳傘求生
選了 \(a_i\) 去 \(b_j\) 房間,如果反悔,一定是更優的 \(a_k\) 無處可去了,替換後增長的是 \(a_k-a_i\)
for(int i = 1, j = 1; i <= n; ++i){ while(j <= m && b[j].fi < a[i]) Q.push(-b[j].fi + b[j].se), ++j; if(!Q.empty() && a[i] + Q.top() > 0) Ans += a[i] + Q.top(), Q.pop(), Q.push(-a[i]); }