藍書1 2 二分和三分

2022-06-01 04:39:09 字數 1668 閱讀 3074

t1 poj 2018 

題目大意:

乙個數列 求乙個平均數最大的 長度不長於l的子串

思路:二分乙個值 x  假設這個數為平均值

則當所有數列都減去這個值時 若剩餘數列中長度不小於l的最大子串非負 則l=mid

最大子串可以表示為一段字首和減去之前一段最小的字首和且長度大於l

就可以o n 來check

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define inf 2139062143

10#define ll long long

11#define maxn 101010

12#define eps 1e-5

13using

namespace

std;

14 inline int

read()

1518

while(isdigit(ch))

19return x*f;20}

21int

n,m,a[maxn];

22double

g[maxn],sum[maxn];

23int check(double

x)24

32int

main()

3343 printf("

%d\n

",(int)(r*1000

));44 }

view code

t2 數列分段2

題目大意:

乙個數列 分成m段使每段和最大的最小

思路:二分乙個值x 判斷是否可以使數列被分成m段 每段小於x

判斷時 暴力判斷即可

t3 擴散

題目大意:

每個點在下乙個時間單位都會向四個方向擴散

求所有點最短多長時間會形成乙個聯通塊

思路:二分時間判斷是否可以連邊 

並查集check是否形成乙個聯通塊

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define inf 2139062143

10#define ll long long

11#define maxn 101010

12#define eps 1e-5

13using

namespace

std;

14 inline int

read()

1518

while(isdigit(ch))

19return x*f;20}

21struct node g[maxn];

22int

n,f[maxn];

23int find(int x)

24int check(int

x)25

34int

main()

3545 printf("

%d\n

",ans);

46 }

view code

t4 燈泡

題解鏈結

t5 傳送帶

題解鏈結

二分和三分

三分二分,乙個簡單而神奇的演算法,可以簡化時間複雜度,但是用二分有乙個條件,就是我們進行二分的序列必須有單調性。原理 aa中找乙個數x xx 保證x xx一定存在 我們可以用樸素演算法,直接從頭到尾找一遍,時間複雜度o n o n o n 如果當序列a aa的長度十分大時,這種方法就不好用了。二分橫...

二分和三分

二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...

二分和三分

二分查詢 二分的精度問題,一般用double解決,eps 1e 8,關於l,r的取值看那個區間有沒有可能取到,然後 1或者 1,會不會使得值變化得特別大,如果會變化得特別大,那麼就l,r都取mid o log n 查詢乙個數 int b search int x return 1 查詢左邊界 int...