時間複雜度o(log n).
資料區間:
l----------------mid-----------------r
**實現:
while
(l
給定乙個按照公升序排列的長度為 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
輸入樣例:
6 3
1 2 2 3 3 434
5
輸出樣例:
3 4
5 5-1 -1
#include
using
namespace std;
const
int n=
100010
;int n,m;
int q[n]
;int
main()
if(q[r]
==x)
cout<
}else
cout<<
"-1 -1"
<
}return0;
}
例:輸入乙個長度為 n 的整數序列。
接下來再輸入 m 個詢問,每個詢問輸入一對 l,r。
對於每個詢問,輸出原序列中從第 l 個數到第 r 個數的和。
輸入格式
第一行包含兩個整數 n 和 m。
第二行包含 n 個整數,表示整數數列。
接下來 m 行,每行包含兩個整數 l 和 r,表示乙個詢問的區間範圍。
輸出格式
共 m 行,每行輸出乙個詢問的結果。
資料範圍
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤數列中元素的值≤1000
輸入樣例:
5 3
2 1 3 6 4
1 21 3
2 4
輸出樣例:
綠色的子矩陣的和=(紫色+黑色)-(紅色+黑色)
子矩陣求和:
輸入乙個 n 行 m 列的整數矩陣,再輸入 q 個詢問,每個詢問包含四個整數 x1,y1,x2,y2,表示乙個子矩陣的左上角座標和右下角座標。
對於每個詢問輸出子矩陣中所有數的和。
輸入格式
第一行包含三個整數 n,m,q。
接下來 n 行,每行包含 m 個整數,表示整數矩陣。
接下來 q 行,每行包含四個整數 x1,y1,x2,y2,表示一組詢問。
輸出格式
共 q 行,每行輸出乙個詢問的結果。
資料範圍
1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩陣內元素的值≤1000
輸入樣例:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
輸出樣例:
17
2721
#include
using
namespace std;
const
int n=
1e5;
int n,m,q;
int temp[n]
[n];
int sum[n]
[n];
intmain()
for(
int i=
1;i<=n;i++
)for
(int j=
1;j<=m;j++
)for
(int i=
1;i<=q;i++
)return0;
}
字首和 二分
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...
二分與字首和 學習筆記
整數二分要注意邊界,最好背過一套模板 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,in...
二分和字首和(藍橋)
二分 1.數的範圍 題意 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。1 n 100010,q 10000.對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 思路 對於已經排好序的,且要求查詢陣列中某乙個數的位置,屬於搜尋類...