PAT:二分模板

Posted 花落,莫相离

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT:二分模板相关的知识,希望对你有一定的参考价值。

1.寻找指定元素是否存在

int binarySearch(int A[], int left, int right, int x){
    int mid;
    while(left <= right){
        mid = (left + right) / 2;
        if(A[mid] == x) return mid;
        else if(A[mid] > x) right = mid - 1;
        else    left = mid + 1;
    }
    return -1;
}

2.已知答案一定存在,寻找其位置

寻找有序序列第一个满足某条件的元素的位置(满足条件的都在右边),注意区间必须能覆盖解的所有可能取值。同理,若找最后一个满足某条件的,可以找第一个不满足该条件的,最后位序减一即可。
此模板若设置一个特定的值来代表不存在解的情况,即可取代上一个模板来用。

int solve(int left, int right){
    int mid;
    while(left < right){//此处没有等号,因为取等号时就代表着已经确定了最终答案
        mid = (right + left) / 2;
        if(条件成立)    right = mid;    //往左找
        else    left = mid+1;   //往右找
    }
    return left;
}

3.拓展应用:快速幂的递归写法

//下面为快速幂的递归写法
//a^b%m
typedef long long LL;
LL binaryPow(LL a, LL b, LL m){
    //幂为0直接为1
    if(!b)  return 1;
    //该写法判断奇数较为简洁,转换为a*a^(b-1)%m
    if(b&1) return a * binaryPow(a, b-1, m) % m;
    //注意下面一定要先求出binaryPow(a, b/2, m),再求积,不然时间复杂度又回去了
    else{
        LL mul = binaryPow(a, b/2, m);
        return mul * mul % m;
    }
}

以上是关于PAT:二分模板的主要内容,如果未能解决你的问题,请参考以下文章

PAT二分查找---1030 完美数列 (25分)

PAT甲级1048 Find Coins (25 分)(二分)

PAT-二分法求多项式单根

PAT 1049. 数列的片段和

PAT-乙级-1049 数列的片段和

解题模板一些很基础的板子