链接
题目描述
输入n个单调不减的整数 ,第i个数的编号为i,然后进行m次询问。对于每次询问,给出一个整数 ,要求输出这个数字在序列中的编号,如果没有找到的话输出 -1
样例输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
样例输出
1 2 -1
思路
可以二分
但是因为是倍增练习题就用了倍增
设当前位置为
a
n
s
ans
ans
那么我们可以让i从20倒序枚举,依次寻找
a
n
s
+
2
i
ans + 2^i
ans+2i这个位置与目标的关系
若满足就可以直接转移
a
n
s
ans
ans
最后比较一下
a
n
s
+
1
ans + 1
ans+1的数是否是目标即可
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100000007];
int m, n, ans;
void solve(int x)
{
int ans = 0;
for(int i = 20; i >= 0; --i)
{
if(a[ans + (1 << i)] < x && ans + (1 << i) <= n)
ans = ans + (1 << i);
}
if(a[ans + 1] == x) printf("%d ", ans + 1);
else printf("-1 ");
}
int main()
{
scanf("%d%d", &n ,&m);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for(int i = 1; i <= m; ++i)
{
int x;
scanf("%d", &x);
solve(x);
}
return 0;
}