本文主要是介绍二分板子(找第一次出现的编号),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
P2249 【深基13.例1】查找
题目描述
输入 �n 个不超过 109109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 �1,�2,…,��a1,a2,…,an,然后进行 �m 次询问。对于每次询问,给出一个整数 �q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1−1 。
输入格式
第一行 22 个整数 �n 和 �m,表示数字个数和询问次数。
第二行 �n 个整数,表示这些待查询的数字。
第三行 �m 个整数,表示询问这些数字的编号,从 11 开始编号。
输出格式
输出一行,�m 个整数,以空格隔开,表示答案。
输入输出样例
输入 #1复制
11 3 1 3 3 3 5 7 9 11 13 15 15 1 3 6输出 #1复制
1 2 -1说明/提示
数据保证,1≤�≤1061≤n≤106,0≤��,�≤1090≤ai,q≤109,1≤�≤1051≤m≤105
本题输入输出量较大,请使用较快的 IO 方式。
#include<iostream>
#include<algorithm>
#include<cmath>using namespace std;typedef long long ll;
const int N = 1e6 + 10;
ll n , m;
int a[N];//二分板子
int left(int a[] , int len , int x)
{int l = 0 , r = len;while(l + 1 < r){int mid = (l + r) >> 1; //折半查找if(a[mid] < x)l = mid;else r = mid;}if(a[r] == x) return r;else return -1;
}int main()
{scanf("%d %d",&n,&m);for(int i = 1 ; i <= n ; i++){scanf("%d",&a[i]);}while(m--){int x;scanf("%d",&x);int res = left(a,n,x);cout << res << " ";}return 0;
}
这篇关于二分板子(找第一次出现的编号)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!