非常簡單地理解帶權二分(wqs二分)

2022-05-27 10:57:13 字數 2414 閱讀 8944

非常感性簡單地理解帶權二分(又名 wqs 二分),儘管不是很嚴謹,如有錯誤請指出

\(\large\natural\)gosha is hunting / 原題鏈結 / 更好閱讀體驗

設我們有 \(a\) 個紅球和 \(b\) 個藍球,用紅球抓 \(i\) 號胖可丁的概率是 \(a_i\),用藍球抓 \(i\) 號胖可丁的概率是 \(b_i\)。

首先我們有乙個暴力 \(\text\):設 \(f_\) 為 \(1\sim i\) 這些胖可丁中,用了 \(j\) 個紅球和 \(k\) 個藍球的最大期望。

\[f_=\max(f_,f_+a_i,f_+b_i,f_+\ 1-(1-a_i)(1-b_i)\ )

\]\(\max\) 中依次代表著對於第 \(i\) 個胖可丁:不用精靈球;只用紅球;只用藍球;兩種球都用。

答案是 \(f_\)。當然這是 \(o(n^3)\) 的,顯然會超時。

我們發現,用了 \((x+1)\) 個精靈球肯定會比用 \(x\) 個精靈球得到的期望更大。所以它是乙個單調的東西。事實上,如果 \(f_\) 中 \(i,k\) 都是不變常數,即它是關於 \(j\) 的函式,那麼它是乙個凸函式。因為你第乙個紅球肯定會抓期望最大的胖可丁,第二個紅球肯定會抓期望次大的胖可丁……這樣增長的速度就會越來越慢。當然, 如果 \(f_\) 中 \(i,j\) 都是不變常數,即它是關於 \(k\) 的函式也同理。所以這個凸函式的性質意味著我們可以用帶權二分。

根據帶權二分的思想,我們需要將 \(f_\) 簡化為 \(f_\)。我們可以假設現在藍球是免費的,想用多少就用多少(好耶!),那這樣就會有轉移方程:

\[f_=\max(f_,f_+a_i,f_+b_i,f_+1-(1-a_i)(1-b_i))

\]時間複雜度 \(o(n^2)\)。

但是,毫無疑問,這樣的話所有的轉移肯定都會加上藍球的貢獻,畢竟免費的肯定越用多越好。所以這樣想:我們給藍球套上乙個**,即,你需要 \(k\) 元才能買到乙個藍球。這樣的話, \(\text\) 方程就是這樣的了:

\[f_=\max(f_,f_+a_i,f_+b_i-k,f_+1-(1-a_i)(1-b_i)-k)

\]這樣肯定就會有一些貧窮的 \(f_\) 不能加上藍球的貢獻。

於是,我們在 \(\text\) 過程中同時記錄一下使用藍球的個數 \(cnt\)。如果 \(cnt>b\) 那麼就是藍球供不應求了。我們肯定會讓 \(k\) 更大一點,也就是讓藍球更昂貴,更奢侈,讓更多可憐的 \(f_\) 買不到藍球,以減少 \(cnt\)。

相反地,如果 \(cnt,那麼就是藍球生產過剩、供大於求。我們必須要讓 \(k\) 更小一點,也就是讓藍球更便宜,以增加 \(cnt\)。

如果 \(cnt=b\) ,恭喜,我們恰好用了 \(b\) 個藍球,這應該就是合適的**了。

答案就是 \(f_\)……不對,藍球事實上是免費的。所以我們要把那些錢還回去,答案就是 \(f_+cnt\times k\)。

於是我們可以二分這個價錢 \(k\)。一開始二分的邊界是 \(l=0,r=1\),因為概率都是大於等於零、小於等於一的。

時間複雜度變為 \(o(n^2\log v)\)。其中 \(\log v\) 是二分中產生的。

所以你也可以繼續給紅球也依法炮製,給它安乙個**。而且 \(\text\) 也不復存在,變成了乙個貪心。更令人喜出望外的是,這樣時間複雜度甚至可以變成 \(o(n\log^2 v)\),可以非常充裕地通過本題!

注意最後答案是 \(f_+a\times k_a +b\times k_b\),而不是\(f_+cnt_a\times k_a +cnt_b\times k_b\)。原因的話需要去以斜率之類的方式去說明。由於本篇題解只是感性理解,而非用斜率去證明,所以大家就把這個東西記下來吧。

注意精度……這個題目很在乎精度。我這裡是eps=1e-8

而且從這個題目我知道了:人傻常數大,人傻常數低……(同校大佬一次過,時間還少)

碼風毒瘤見諒。

#include#define rep(i,x,y) for(int i=x;i<=y;++i)

#define lod long double

using namespace std;

const int n7=2021;const lod eps=1e-8;

int n,a,b,cnt1,cnt2;

lod a[n7],b[n7],c[n7],tot,val1,val2,ans;

void check(lod rmb1,lod rmb2)}

int main()

val1=mid1;

if(cnt1==a)break;

if(cnt1>a)l1=mid1;

else r1=mid1;

} ans=tot+val1*a+val2*b;

cout

}

學習筆記 凸優化 WQS二分 帶權二分

從乙個題帶入 八省聯考2018 林克卡特樹lct wqs二分 比較詳細的 題解 p4383 八省聯考2018 林克卡特樹lct 簡單總結和補充 凸函式,限制 二分斜率,找切點橫縱座標,判斷k的位置 找切點座標 集體 mid x 證明還是凸函式 f x 2 f x 1 f x 1 f x 仍然成立 每...

WQS二分 學習筆記

我的理解 不一定很對 大概就是某個東西越多總貢獻越大,要求剛好取n個時的最優解。可以把 dp 狀態裡記的取的個數這一維去掉,而設乙個 co st,取 k 個物品,總貢獻要多減去cost k,然後 dp cos t 越大,物品數取越少。二分 co st使得 dp 得到的答案剛好取了 n 個物品。設 g...

WQS二分學習筆記

wqs 二分聽起來是個很難的演算法,其實學起來也並不是那麼難。在某些題目中,會對於某個取得越多越優的物品,限定你最多選擇 k 個,問你能得到的最優答案。例如這道題目 cf739e gosha is hunting。這些題目一般都可以通過列舉選擇的物品個數並 o n dp 來做到 o nk 但如果隨著...