题源怎么写着递归那么的步履蹒跚呢
题目描述
输入 n 个不超过 10^9 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,…,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。
输入格式
第一行 2 个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
输出格式
输出一行,m 个整数,以空格隔开,表示答案。
输入输出样例
输入 #1复制
11 3 1 3 3 3 5 7 9 11 13 15 15 1 3 6输出 #1复制
1 2 -1说明/提示
数据保证,1≤n≤10^6,0≤ai,q≤10^9,1≤m≤10^5
本题输入输出量较大,请使用较快的 IO 方式。
#include<bits/stdc++.h>
using namespace std;
int n,m,mid;
int minn=1000000009;
long long a[1000008]={0},t=0;
void dfs(int t,int L,int R){if(L>R){if(minn<1000000009){cout<<minn<<" " ;return ;}else {cout<<-1<<" ";return;}}if(t==a[mid]){minn=min(minn,mid);}if(t>a[mid]){int tmp=mid+1;mid=(tmp+R)/2;dfs(t,tmp,R);//右半部分 }if(t<=a[mid]){//需要取到最左边,要等于 int tmp1=mid-1;mid=(L+tmp1)/2;dfs(t,L,tmp1);//左边部分 }
}//int dfs( int l, int r, int t)//这种写法的也完全可以的
//{
// if (l == r)
// {
// if (a[l] == t)
// return l;
// else
// return -1;//最后位置的数与待查询数不相等,说明数列里没有此数
// }
// int mid = (l + r) / 2;
// if (t <= a[mid])
// dfs(a, l, mid, t);//在左边区域找
// else
// dfs(a, mid + 1, r, t);//在右边区域找
//}int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>t;mid=(n+1)/2;minn=1000000009;//每一次这个位置都需要重新赋值一哈 dfs(t,1,n);
// cout<<minn<<" ";}return 0;
}