【深基13.例1】查找

题目描述

输入 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_ios 个不超过 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_#include_02 的单调不减的(就是后面的数字不小于前面的数字)非负整数 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_#include_03,然后进行 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_04 次询问。对于每次询问,给出一个整数 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_05,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_ios_06

输入格式

第一行 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_07 个整数 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_ios【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_04,表示数字个数和询问次数。

第二行 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_ios 个整数,表示这些待查询的数字。

第三行 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_04 个整数,表示询问这些数字的编号,从 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_ios_12 开始编号。

输出格式

输出一行,【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_04 个整数,以空格隔开,表示答案。

样例 #1

样例输入 #1

11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6

样例输出 #1

1 2 -1

提示

数据保证,【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_#include_14【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_ios_15【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)_i++_16

本题输入输出量较大,请使用较快的 IO 方式。

思路

数据量很大,需要优化读入。通过递归进行二分查找。

AC代码

#include <iostream>
#include <vector>
#include <algorithm>
#define AUTHOR "HEX9CF"
using namespace std;

int read(){
    char ch;
    int x = 0;
    while((ch < '0' || ch > '9')){
        ch = getchar();
    }
    while(!(ch < '0' || ch > '9')){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x;
}

int main(){
    int n, m;
    vector<int> a;
    n = read();
    m = read();
    for(int i = 0; i < n; i++){
        a.push_back(read());
    }
    for(int i = 0; i < m; i++){
        if(i){
            putchar(' ');
        }
        int t = read();
        vector<int>::iterator lb = lower_bound(a.begin(), a.end(), t);
        if(lb == a.end() || *lb != t){
            cout << -1;
        }else{
            cout << lb - a.begin() + 1;
        }
    }
    return 0;
}