点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e6+100;
int n,t,A[N],ans;
bool check(int x,int y){
if(y>x)return 0;
return 1;
}
int main(){
int n,p;
scanf("%d%d",&n,&p);
for(int i=1;i<=n;++i)scanf("%d",&A[i]);
sort(A+1,A+1+n);
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(check(A[mid],p)){
r=mid-1;//mid已经满足记录一下,然后从mid-1开始查
ans=mid;
}else{
l=mid+1;//mid都不合法,那就从mid+1开始查
}
}
printf("%d\n",A[ans]);
return 0;
}
离散化,就是排序,然后去重(unique返回的是end()(就相当于n+1),所以直接-1得到的是大小),再二分查一下,lower_bound(),那么返回位置的指针,接触引用即可。注意unique并不删除,只是把重复的扔到后面,用stl容器记得清除
sort(q.begin(),q.end());
q.erase(unique(q.begin(),q.end()),q.end());