洛谷-P2249 【深基13.例1】查詢
阿新 • • 發佈:2021-07-10
題目描述
輸入n(n≤1e6)個不超過1e9的單調不減的(就是後面的數字不小於前面的數字)非負整數a1,a2,…,an,然後進行m(m≤1e5)次詢問。對於每次詢問,給出一個整數q(q≤1e9),要求輸出這個數字在序列中第一次出現的編號,如果沒有找到的話輸出 -1。
輸入格式
第一行 2 個整數 n 和 m,表示數字個數和詢問次數。
第二行 n 個整數,表示這些待查詢的數字。
第三行 m 個整數,表示詢問這些數字的編號,從 1 開始編號。
輸出格式
m 個整數表示答案。
輸入輸出樣例
輸入#1 |
輸出#1 |
11 3 1 3 3 3 5 7 9 11 13 15 15 1 3 6 |
1 2 -1 |
題目分析
n最大為1e6可見其資料規模比較大,要進行m(最大1e5)次詢問,根據這兩個資料可知普通的普通的查詢方式是肯定行不通的。資料單調不減數的(數列遞增),據此就可以採用二分查詢來查詢資料了。
可行程式碼
#include <iostream> using namespace std; int search(int key, int *arr, int len) { int l = -1, r = len, mid; // 注意的是陣列是從0開始的 while (l + 1 < r) { mid = l + r >> 1; if (arr[mid] <= key) l = mid; else r = mid; } if (arr[r] == key + 1) return r; // 返回的是大於key的第一個位置 return -1; } int main() { int n, m; cin >> n >> m; int arr[n]; for (int i = 0; i < n; i++) cin >> arr[i];while (m--) { int key; cin >> key; int loc = search(key-1, arr, n); if (loc == -1) cout << -1; else cout << loc + 1; if (m) cout << ' '; } return 0; }
END 感謝reader's閱讀,洛谷題目連結:P2249 【深基13.例1】查詢 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)