1. 程式人生 > 其它 >洛谷-P2249 【深基13.例1】查詢

洛谷-P2249 【深基13.例1】查詢

題目描述

輸入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)