【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)

简介: 该题目要求在一个单调不减的整数序列中查找特定数值首次出现的位置,输入包含序列长度、查询次数及数值,输出对应位置或-1。给定样例输入为11个数和3次查询,输出分别为1、2和-1。代码使用C++,通过二分查找优化效率,适应大数据量。

【深基13.例1】查找

题目描述

输入 $n$ 个不超过 $10^9$ 的单调不减的(就是后面的数字不小于前面的数字)非负整数 $a_1,a2,\dots,a{n}$,然后进行 $m$ 次询问。对于每次询问,给出一个整数 $q$,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 $-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

1 2 -1

提示

数据保证,$1 \leq n \leq 10^6$,$0 \leq a_i,q \leq 10^9$,$1 \leq m \leq 10^5$

本题输入输出量较大,请使用较快的 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;
}
目录
相关文章
|
NoSQL 编译器 Linux
CodeBlocks-20.03下载安装及中文教程
CodeBlocks强大之处 1、跨平台,windows、linux 、mac都可以用 2、轻量化,远不及VS占用空间 3、完全免费
3354 1
CodeBlocks-20.03下载安装及中文教程
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
616 6
|
关系型数据库 MySQL 索引
MySQL不走索引的情况分析
MySQL不走索引的情况分析
246 0
MySQL不走索引的情况分析
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的客户关系管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的客户关系管理系统附带文章和源代码部署视频讲解等
105 3
|
存储 C++
【洛谷 P1305】新二叉树 题解(结构体数组+先序遍历+二叉树)
该题目要求实现一个程序,输入一棵二叉树的节点信息并输出其前序遍历结果。输入包含树的节点数`n`和每个节点的左右子节点信息,空节点用`*`表示。样例输入是一个包含6个节点的二叉树,输出前序遍历序列`abdicj`。解决方案是使用一个结构体数组存储二叉树节点,通过`add`函数建立关联,然后用`preOrder`函数进行前序遍历。AC代码提供了一个C++实现,首先读取根节点,然后构建二叉树结构,并进行前序遍历输出。
123 0
如何指定域名写入token
如何指定域名写入token
98 0
【CCF-CSP】201709-2-公共钥匙盒100分(含详细注释)
【CCF-CSP】201709-2-公共钥匙盒100分(含详细注释)
342 0
【CCF-CSP】201709-2-公共钥匙盒100分(含详细注释)
|
关系型数据库 MySQL OLTP
[MySQL FAQ]系列 — 为什么要关闭query cache,如何关闭
[MySQL FAQ]系列 — 为什么要关闭query cache,如何关闭
|
消息中间件 Java Kafka