各种类型的二分模板

1、查找最后一个小于或者等于key的下标,若不存在,则返回-1 ==> 同lower_bound(arr+1, arr+1+n, key)

int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l <= r)
    {
        m = (l+r)/2;
        if (a[m] <= key) l = m + 1;
        else if(a[m] > key) r = m - 1;
    }
    if(l == 0) return -1;//not find
    return l-1;
}

2、查找第一个大于或者等于key的下标,若不存在,则返回-1

int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l <= r)
    {
        m = (l+r)/2;
        if (a[m] < key) l = m + 1;
        else if(a[m] >= key) r = m - 1;
    }
    if(r == n-1) return -1;//not find
    return r+1;
}

3、查找第一个与key相等的下标,若不存在,则返回-1

int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r - l) >> 1);//向下取整
        if (a[m] < key) l = m + 1;
        else r = m;
    }
    if (a[r] == key) return r;
    return -1;
}

4、查找最后一个与key相等的小标,若不存在,则返回-1

int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r + 1 - l) >> 1);//向上取整
        if (a[m] <= key) l = m;
        else r = m - 1;
    }
    if (a[l] == key) return l;
    return -1;
}

5、查找第一个大于key的下标,若不存在,则返回-1 ==> 同upper_bound(arr+1, arr+n+1, key)

int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r - l) >> 1);//向下取整
        if (a[m] <= key) l = m + 1;
        else r = m;
    }
    if (a[r] > key) return r;
    return -1;
}

6、查找最后一个小于key的下标,若不存在,则返回-1

int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r + 1 - l) >> 1);//向上取整
        if (a[m] < key) l = m;
        else r = m - 1;
    }
    if (a[l] < key) return l;
    return -1;
}

时间: 2024-10-12 22:59:48

各种类型的二分模板的相关文章

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

2.类型不一致可变参数模板与类型一致函数模板

//类型不一致函数模板 1 #include <iostream> 2 #include <cstdarg> 3 using namespace std; 4 5 void show() 6 { 7 8 } 9 10 //参数类型不一致,个数不确定 11 template<typename T,typename...Args>//typename...Args可变参数 12 void show(T t, Args...args)//args如果没结束就当做T t,Arg

Aizu ITP2_6_A(二分模板)

For a given sequence $A = \{a_0, a_1, ..., a_{n-1}\}$ which is sorted by ascending order, find a specific value $k$ given as a query. Input The input is given in the following format. $n$ $a_0 \; a_1 \; ,..., \; a_{n-1}$ $q$ $k_1$ $k_2$ : $k_q$ The n

Honk&#39;s pool(二分模板题)

题意:有n个水池,每个水池有a[i]单位水,有k次操作,每次操作将水量最多的水池减少一单位水,水量最少的水池增加一单位水,问最后水量最大的水池和水量最少的水池相差的水量. 思路:二分最后的最大水量和最小水量,特别的,模拟一下可以发现如果总水量sum%n==0,则最大值的下界和最小值的上界均为sum/n,若sum%n!=0,则最大值的下界为sum/n+1,最小值上界为sum/n.二分时注意选取区间是左闭右开还是左开右闭. #include <iostream> #include <algo

二分模板// The Frog&#39;s Games +Aggressive cows

  二分的情况不同所输出的模板也不同列如下面两个题目                                                    The Frog's Games   代码如下               //二分专练                                                #include <stdio.h> //lower_bound大于等于它的第一个数                                     

二分模板

从卿学姐那里偷来的模板 (整数二分  待更新更加高级的 int left = 0,ri =maxn; while (left <= ri) { int mid = (left + ri)/2; if( check(mid) ) ans=mid,left = mid+1; else ri= mid-1; } cout << ans <<endl;

AcWing 789. 数的范围 二分+模板

https://www.acwing.com/problem/content/791/ #include<bits/stdc++.h> using namespace std; const int N=100010; int n,m; int q[N]; int main() { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d",&q[i]); while(m--)

WordPress使用自定义文章类型实现任意模板的方法和怎么做邮件回复

主要就是使用了register_post_type 函数. 1.创建插件目录 新建一个文件夹用来存放插件文件,这里我就命名这个文件夹为myMood 2.创php代码文件 在刚才创建的文件夹里面新建一个php文件,命名为myMood,用来书写插件代码 3.添加头部描述 复制代码 代码如下:<?php/*Plugin Name: Movie ReviewsPlugin URI: http://wp.tutsplus.com/Description: Declares a plugin that wi

UVAlive7501 Business Cycle 2015ECfinal B(二分模板)

题意:给你一个环,环有n个点,编号0~n-1,每个点有一定的权值,从点0出发沿编号走,到达某一个节点则把目前总权值加上这个节点的权值,如果结果小于0则变成0.现在给你最多可以走的步数P和最大需要到达的权值大小G,问你需要的最小的初始权值为多少,能在P步内能够产生的最大权值大于等于G 题解:很容易想到初始权值越大,经过同样步数能够得到的权值就越大,当然是非严格递增的.那么直接想办法二分寻找初始权值就可以.但是如果步数太大了就没法模拟了,所以要消除步数的影响.步数的影响主要来源于在走环的过程中可能由