数的范围
-
主要思想:压缩区间
-
1.找出左边界
-
while(l<r){ int mid=l+r>>1; //不用加1 if(p[mid]>=x) r=mid; //如果x较小 压缩右区间r else l=mid-1; } cout<<l<<endl;
-
-
2.找出右边界
-
while(l<r){ int mid=l+r+1>>1; //如果是l=mid就+1 if(p[mid]<=x) l=mid; //如果x在mid右侧 应该将左区间压缩 l=mid else r=mid-1; //x在左侧 右区间r压缩 } cout<<l<<endl;
-
代码:
#include<iostream> using namespace std; const int N=100010; int p[N]; int n,q; int main(){ scanf("%d%d", &n,&q); for(int i=0;i<n;i++) scanf("%d", &p[i]); while(q--){ int x; scanf("%d", &x); int l=0,r=n-1; while(l<r){ //找左边界 int mid=l+r>>1; if(p[mid]>=x) r=mid; else l=mid+1; } //左边界不存在 说明这个数不存在 if(p[l]!=x) cout<<"-1 -1"<<endl; else{ cout<<l<<" "; int l=0,r=n-1; while(l<r){ //找出右边界 int mid=l+r+1>>1; if(p[mid]<=x) l=mid; else r=mid-1; } cout<<l<<endl; } } return 0; }
-