• 二分及离散化板子


    点击查看代码
    #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());
    
  • 相关阅读:
    Beans
    HDU2830
    HDU1176
    rtc关机闹钟7 jni层 com_android_server_AlarmManagerService
    rtc关机闹钟6 AlarmManagerService研究
    rtc关机闹钟5 AlarmManager研究
    数论学习_裴蜀定理
    hdu-5465-二维BIT+nim
    hdu-1892-二维BIT
    hdu-2227-dp+bit
  • 原文地址:https://www.cnblogs.com/zasdcn/p/15872788.html
Copyright © 2020-2023  润新知