1. 程式人生 > 其它 >[筆記] 帶悔貪心

[筆記] 帶悔貪心

簡介

貪心的侷限性在於其只滿足當前的最優,無法保證全域性的最優,一般此時就會選擇 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]);
}

P3045 [USACO12FEB]牛券

P4694 [PA2013] Raper

CF865D Buy Low Sell High

P4053 [JSOI2007]建築搶修

CF436E Cardboard Box

P5470 [NOI2019] 序列

CF767E Change-free

CF1404C Fixed Point Removal

CF1251E2 Voting (Hard Version)