二分及离散化板子

点击查看代码
#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());
posted @ 2022-06-28 21:52  zasdcn  阅读(42)  评论(0编辑  收藏  举报