6 条题解
-
0
一种全新的思路来解决二分问题
不需要仔细思考边界问题
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #include<string> using namespace std; int n,q; const int N=100010; int nums[N]; int front_find(int target){ int l=-1,r=n; while(l+1!=r){ int mid=l+r>>1; if(nums[mid]<target) l=mid; else r=mid; } if(r==n || nums[r]!=target) return -1; else return r; } int end_fond(int target){ int l=-1,r=n; while(l+1!=r){ int mid=l+r>>1; if(nums[mid]>target) r=mid; else l=mid; } if(l==-1 || nums[l]!=target) return -1; else return l; } void slove(){ int target; cin>>target; int l=front_find(target); if(l!=-1){ int r=end_fond(target); cout<<l<<" "<<r<<endl; } else cout<<"-1 -1"<<endl; } int main(){ cin>>n>>q; for(int i=0;i<n;i++) scanf("%d",&nums[i]); while(q--) slove(); return 0; }
信息
- ID
- 88
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 655
- 已通过
- 149
- 上传者