4 solutions
-
1
#简单的二分
#include<bits/stdc++.h> using namespace std; #define ll long long ll num[1000005],n,m,x,ans[10005]; void search(int u,int v)//简单二分 { int l=1,r=n,mid; while(l<r) { mid=(r+l)/2; if(num[mid]<u) l=mid+1; else r=mid; } if(num[l]!=u)//储存数据 ans[v]=-1; else ans[v]=l; } int main() { std::ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++) cin>>num[i]; for(int i=1;i<=m;i++) { cin>>x; search(x,i);// } for(int i=1;i<=m;i++) cout<<ans[i]<<" "; return 0; }
-
1
#include <stdio.h> int a[1000001],b[1000001],sz[1000001];//a数列,b要询问的数字,sz存待输出的m个结果 int f(int mm,int s,int f){//mm要查找的值,s起始下标,f结束下标 int temp=0; while(s<f){ temp=(s+f)/2;//取s,f中点 if(mm<=a[temp]) f=temp; else s=temp+1; } if(mm==a[s]) return s+1; else return -1; } int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<m;i++) scanf("%d",&b[i]); for(int i=0;i<m;i++) sz[i]=f(a,b[i],0,n-1); for(int i=0;i<m;i++) printf("%d ",sz[i]); printf("\n"); return 0; }
-
1
-
0
//lower_bound(a,a+n,flag)-a;大法得问问为什么我没用呢》? #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+5; ll n,m; int a[N]; int y; int bs(int *a,int x){ int l=0; int r=n; while(l<r){ int mid=(l+r)>>1; if(a[mid]>=x)r=mid; else l=mid+1; } if(a[l]==x)return l+1; return -1; } int main(){ cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; while(m--){ cin>>y; cout<<bs(a,y)<<" "; } return 0; } ···
- 1
Information
- ID
- 139
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 462
- Accepted
- 57
- Uploaded By