>Link
ybtoj查找编号
>Description
给出一个长度为 N N N的不下降序列, m m m次询问数字 x x x在序列中的哪个位置(或者不在)
>解题思路
(我第一眼:嗯?这不二分?)
但是这道题需要倍增来做(因为放在倍增的专题里)
左端点初始值为0,不断缩小区间的长度
2
i
2^i
2i,根据不下降序列的性质适当移动区间的左端点
找
x
x
x的最前面位置就是找最后一个比
x
x
x小的数的位置+1
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
using namespace std;
int n, m, a[N], lg[N], ans;
int main()
{
int x;
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf ("%d", &a[i]);
for (int i = 1; i <= n; i++)
lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
for (int i = 1; i <= m; i++)
{
scanf ("%d", &x);
ans = 0;
for (int j = lg[n] - 1; j >= 0; j--)
{
if (ans + (1 << j) > n) continue;
if (a[ans + (1 << j)] < x)
ans += 1 << j;
}
if (a[ans + 1] == x) printf ("%d ", ans + 1);
else printf ("-1 ");
}
return 0;
}