整數二分要注意邊界,最好背過一套模板
bool
check
(int x)
// 區間[l, r]被劃分成[l, mid - 1]和[mid, r]時使用:
void
bsearch_1
(int l,
int r)
}// 區間[l, r]被劃分成[mid + 1, r]和[l, mid]時使用:
void
bsearch_1
(int l,
int r)
}
789. 數的範圍
給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。
對於每個查詢,返回乙個元素k的起始位置和終止位置(位置從0開始計數)。
如果陣列中不存在該元素,則返回「-1 -1」。
輸入格式:
第一行包含整數n和q,表示陣列長度和詢問個數。
第二行包含n個整數(均在1~10000範圍內),表示完整陣列。
接下來q行,每行包含乙個整數k,表示乙個詢問元素。
輸出格式:
共q行,每行包含兩個整數,表示所求元素的起始位置和終止位置。
如果陣列中不存在該元素,則返回「-1 -1」。
資料範圍:
1≤n≤100000,
1≤q≤10000,
1≤k≤10000
輸入樣例:
631
2233
4345
輸出樣例:
345
5-1-
1
**:
#include
using
namespace std;
const
int n =
100001
;int a[n]
;int
main()
for(
int i =
0; i < k; i++)if
(a[r]
== x)
cout << l << endl;
}else
//找不到左端點直接輸出 -1 -1
cout <<
"-1 -1"
<< endl;
}return0;
}
相對整數二分來說簡單多了~ 沒有坑人的邊界問題
bool
check
(int x)
void
bserach
(double l,
double r)
}
790. 數的三次方根
給定乙個浮點數n,求它的三次方根。
輸入格式:
共一行,包含乙個浮點數n。
輸出格式:
共一行,包含乙個浮點數,表示問題的解。
注意,結果保留6位小數。
資料範圍:
−10000 ≤ n ≤ 10000
輸入樣例:
1000.00
輸出樣例:
10.000000
**:
#include
#include
using
namespace std;
intmain()
double l =
0, r =
10001
;double mid;
while
(r - l >
1e-8)if
(fu)
mid *=(
-1);
printf
("%.6f"
, mid)
;return0;
}
1230. k倍區間
給定乙個長度為 n 的數列,a1,a2,…an,如果其中一段連續的子串行 ai,ai+1,…aj 之和是 k 的倍數,我們就稱這個區間 [ i , j ] 是 k 倍區間。
你能求出數列中總共有多少個 k 倍區間嗎?
輸入格式:
第一行包含兩個整數 n 和 k。
以下 n 行每行包含乙個整數 ai。
輸出格式:
輸出乙個整數,代表 k 倍區間的數目。
資料範圍:
1 ≤ n , k ≤ 100000
1 ≤ ai ≤ 100000
輸入樣例:
521
2345
輸出樣例:
6
**:
#include
using
namespace std;
const
int n =
100010
;long
long
int n, k, x, ans =0;
long
long
int s[n]
;long
long
int res[n]
;int
main()
cout << ans << endl;
return0;
}
二分與字首和
時間複雜度o log n 資料區間 l mid r 實現 while l給定乙個按照公升序排列的長度為 n 的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素 k 的起始位置和終止位置 位置從 0 開始計數 如果陣列中不存在該元素,則返回 1 1。輸入格式 第一行包含整數 n 和 q,表示陣列...
字首和 二分
powered by ab in 局外人 拿洛谷的乙個例子記一下字首和。資料超過了1e5,故o n 2 的演算法又行不通,所以換二分 include typedef long long ll using namespace std ll n,m,l,r ll a 1000001 sum 100000...
二分和字首和(藍橋)
二分 1.數的範圍 題意 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。1 n 100010,q 10000.對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 思路 對於已經排好序的,且要求查詢陣列中某乙個數的位置,屬於搜尋類...