P2249查找

作者: qiqi 分类: 二分查找/答案 发布时间: 2025-10-02 20:31

输入 n 个不超过 109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1​,a2​,…,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 1;
int x[N];

int n, m, q;

int main()
{
	bool isfirst = true;
	int *p, pos;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
		scanf("%d", x + i);

	sort(x, x + n);
	while (m--)
	{
		scanf("%d", &q);
		p = lower_bound(x, x + n, q);

		if (*p == q)
		{
			pos = p - x + 1;
		}
		else
			pos = -1;

		if (isfirst)
		{
			isfirst = false;
			printf("%d", pos);
		}
		else
		{
			printf(" %d", pos);
		}

	}
	printf("\n");
	return 0;
}

直接用二分搜索,有种特殊情况会超时:数据中所有的数据都是1,查找1,那么第一次计a[mid]==1就成立。然后指向mid位置的指针要一直往前判断,是否仍然等于1。一直比较到第一个位置就会超时。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

标签云