題目很明顯的乙個事情,求第\(k\)大的最小值,一般採用的做法是二分(有人會問,但是不滿足二分性啊,接著往下看)。
考慮二分答案,但是如何檢驗\(mid\)是對還是錯,考慮每次只能取\(<=mid\)的數字,如果能取到\((n-k)+1\)個數字以上就可以,至於看能否取到\(n-k+1\)個,採用二分圖匹配,左邊的點是行,右邊的點是列,乙個格仔能被取,就把其行和列連邊。
為什麼可以滿足二分性,他們認為不滿足二分性就只有乙個原因,如果我們假定的第\(k\)大的數字太大的話,可能根本取不到\(k\)個大於等於這個數字的格仔,但是可以取到\(n-k+1\)個以上小於等於這個數字的格仔。
但是我們從函式的角度來證明。
我們設當我們假定的第\(k\)大的數字為\(t\)時,小於等於\(t\)的格仔最多取\(f(t)\)個。
那麼很明顯\(f(t)≤f(t+1)\),那麼如果\(f(t-1),那麼\(t\)就是答案。
\(f(t-1)\)最多取\(n-k\)個,同時\(f(t)≥n-k+1\),取\(f(t)\)個小於等於\(t\)的格仔,\(n-f(t)\)個大於\(t\)的格仔,此時第\(k\)大數小於等於\(t\),且因為\(f(t-1)≠f(t)\),所以存在\(t\)的格仔且為第\(k\)大,所以構造出了第\(k\)大為\(t\)的方案。
所以只要存在\(f(t-1),就可以構造出第\(k\)為\(t\)的方案。
現在證明假如存在最小答案\(t\),其一定滿足\(f(t-1),首先,\(f(t)\)不用證明了(顯然),但是\(f(t-1)\)嗎,首先如果\(f(t-1)≥n-k+1\),則一定存在\(i\)使得\(f(i)且\(i且使得\(∀i=n-k+1\),這樣\(i+1\)也是答案,但是\(i+1,矛盾,得證。
且由於\(f(i)≤f(i+1)\),簡單來說就是找唯一乙個滿足\(f(t-1)的位置,可以直接二分。
#include#include#define n 310
#define nn 130000
using namespace std;
inline int mymax(int x,int y)
inline int mymin(int x,int y)
int main()
} int l=floor_limit,r=ceil_limit,mid,ans=ceil_limit;
while(l<=r)
printf("%d\n",ans);
return 0;
}
SCOI2015 小凸玩矩陣
題目 洛谷p4251 bzoj4443。題目大意 有乙個 n times m n leq m 的矩陣,要選出n個數,使得這n個數既不同行也不同列。問選的數中第k大的數最小可以是多少。解題思路 首先二分答案,然後只要判斷,是否能選擇至少n k 1個數,它們的值都不超過當前的答案。然後很簡單,對每個小於...
SCOI2015 小凸玩矩陣 題解
題意見題面。我們容易看出,答案肯定是單調的,所以便想到二分,對於判斷能否選到,我們發現行和列的限制就是二分圖匹配的模型,所以直接套個二分圖就好啦。注意 是第k kk大的數!所以判斷時為n k 1 n k 1 n k 1,因為這個wa了好幾遍qaq include include include us...
SCOI2015 小凸玩密室
演算法難度5,思維難度7,難度6 給定一棵n nn個點的完全二叉樹,樹邊帶權,點帶val x val x val x 的權值。定義兩個點的距離dis u,v dis u,v dis u,v 為u uu到v vv的最短路徑上經過的邊權之和。你一開始可以選擇乙個起始點,並點亮這個點,這一步不需要花費。你...