經過研究,本蒟蒻對令人懵逼的二分答案有了一點心得。
二分的思想主要分三種:
l和r代表的「成本值」均可行,且有乙個ans變數記錄當前的最優
l和r代表的「成本值」均可行,最後的答案是l或r
l代表的「成本值」可行,r不可行,最後的答案是l
很多題目都可以轉換為第一種思想。定義乙個記錄答案的變數即可。所以二分答案的難點還是落到了邊界的處理和答案的更新上。什麼時候用l,什麼時候l和r均可?很多問題困擾了不少小白(包括筆者)。由於實力問題(害),這裡只是筆者做題的一些避坑方法,幫助你少花時間除錯和找到正解。
避坑1.要規避錯誤,乙個要點是清楚什麼情況是滿足條件但不是最優解,另一種情況自然是不滿足條件。在滿足條件時要把答案更新,不滿足則只更新邊界。
避坑2.教練無數次舉過乙個例子left = 2,right = 3。此時需要一些操作,如令mid = (left + right + 1)/2,或left = mid + 1,或right = mid - 1;具體選擇這三中的哪乙個,依題而定。
上題:最長遞增子串行
classsolution ;
int lengthoflis(vector&nums)
dp[l] =min(dp[l],nums[i]);
cout}}
return
len;
}};
當nums[i] 小於等於dp[len]時,我需要找到最大的小於等於nums[i] 的乙個數dp[mid],那麼必須讓它後面的數(如果兩數相等就是它本身)更新成nums[i],而l在while結束迴圈時一定是大於等於right的,因此答案是dp[l],不是dp[r]。
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...
二分查詢和二分答案
1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...
二分與二分答案學習
判斷left,mid,right的符號進行區間的精確。如下為遞迴二分求零點的操作 double find zero point double left,double right,double precesion double mid right left 2 if f mid 0 if f mid ...