1 条题解
-
0
手工二分
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; int a[N]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); int q;scanf("%d",&q); while(q--) { int x;scanf("%d",&x); int l=1,r=n+1; while(l+1<r) { int mid=(l+r)/2; if(a[mid]<=x) l=mid; else r=mid; } printf("%d\n",a[l]!=x ? -1 :l); } return 0; }STL二分(lower_bound upper_bound)
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; int a[N]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); a[n+1]=-2e9; int q;scanf("%d",&q); while(q--) { int x;scanf("%d",&x); int p=lower_bound(a+1,a+n+1,x)-a; if(a[p]==x)printf("%d\n",p); else printf("-1\n"); } return 0; }lower_bound:在一个有序序列中进行二分查找,返回指向第一个 大于等于 x 的元素的位置的迭代器。如果不存在这样的元素,则返回尾迭代器。lower_bound(v.begin(),v.end(),x)。
upper_bound:在一个有序序列中进行二分查找,返回指向第一个 大于 x 的元素的位置的迭代器。如果不存在这样的元素,则返回尾迭代器。upper_bound(v.begin(),v.end(),x)。
- 1
信息
- ID
- 278
- 时间
- 300ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 1015
- 已通过
- 135
- 上传者