二分查詢模板
阿新 • • 發佈:2020-07-26
題目相關
題目連結
計蒜客,https://nanti.jisuanke.com/t/T1560。
題目描述
蒜頭君手上有個長度為 n 的陣列 A。由於陣列實在太大了,所以蒜頭君也不知道數組裡面有什麼數字,所以蒜頭君會經常詢問整數 x 是否在陣列 A 中。
輸入格式
第一行輸入兩個整數 n 和 m,分別表示陣列的長度和查詢的次數。
接下來一行有 n 個整數 ai。
接下來 m 行,每行有 1 個整數 x,表示蒜頭君詢問的整數。
輸出格式
對於每次查詢,如果可以找到,輸出"YES",否則輸出"NO"。
樣例輸入
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
樣例輸出
NO
YES
NO
YES
NO
資料範圍
1 ≤ n, m ≤10^5, 0 ≤ x ≤ 10^6。
分析
標準的二分查詢模板。
題目要求
輸入一個 x,在陣列 A 中找到,輸出"YES",否則輸出"NO"。
程式設計思路
1、讀入陣列 A。
2、對 A 進行排序。
3、讀入一個 x,在陣列 a 二分查詢 x 是否存在。
AC 參考程式碼
STL 版本
利用 algorith 庫中 binary_search 函式。
#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; int a[n]; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=0;i<m;i++) { int x; cin>>x; if(binary_search(a,a+n,x))//萬能的庫函式 { cout<<"YES\n"; } else cout<<"NO\n"; } return 0; }
C++ 版本
自己實現一個類似 STL 的 binary_search 函式。
#include<bits/stdc++.h> using namespace std; int binary_search(int a[],int left,int right,int x) { while(left<=right) { int mid=(left+right)/2; if(x==a[mid]) return mid; else if(x<a[mid]) right=mid-1; elseleft=mid+1; } return -1; } int main() { int n,m; cin>>n>>m; int a[n]; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=0;i<m;i++) { int x; cin>>x; if(-1==binary_search(a,0,n-1,x)) cout<<"NO\n"; else cout<<"YES\n"; } return 0; }
參考連結:
https://blog.csdn.net/justidle/article/details/104600447