8 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=100010; int arr[N]; int n,q,tmp; int bs_left(int arr[],int n,int x) { int l=0,r=n+1; while(l+1<r) { int mid=(l+r)/2; if(arr[mid]>=x)//x——正无穷,只能从第一个等于x退出,从右向左往x挤 { r=mid;//在最终检查时,如果 arr[mid] == x,说明 r 正好指向第一个出现 x 的位置 } else { l=mid; } } if(arr[r]==x) { return r-1; } else { return -1; } } int bs_right(int arr[],int n,int x) { int l=0,r=n+1; while(l+1<r) { int mid=(l+r)/2; if(arr[mid]<=x)//负无穷——x,只能从最后一个x退出,从左向右往x挤 { l=mid;//在最终检查时,如果 arr[mid] == x,说明 l 正好指向最后一个出现 x 的位置 } else { r=mid; } } if(arr[l]==x) { return l-1; } else { return -1; } } int main() { cin>>n>>q; for(int i=1;i<=n;i++) { cin>>arr[i]; } while(q--) { cin>>tmp; int ans_left=bs_left(arr,n,tmp); int ans_right=bs_right(arr,n,tmp); cout<<ans_left<<" "<<ans_right<<endl; } return 0; }
信息
- ID
- 88
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 804
- 已通过
- 185
- 上传者