ac 789数的范围

二分法的模板

    bool check(int x) {/* ... */} // 检查x是否满足某种性质

    // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
    int bsearch_1(int l, int r)
    {
        while (l < r)
        {
            int mid = l + r >> 1;
            if (check(mid)) r = mid;    // check()判断mid是否满足性质
            else l = mid + 1;
        }
        return l;
    }
    // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
    int bsearch_2(int l, int r)
    {
        while (l < r)
        {
            int mid = l + r + 1 >> 1;
            if (check(mid)) l = mid;
            else r = mid - 1;
        }
        return l;
    }

例题的解法就是用二分查找那个数字

    #include<bits/stdc++.h>
    using namespace std;
    void help(int num, vector<int>&nums) {
        int l = 0, r = nums.size() - 1;
        while(l < r) {
            int mid = r + l >> 1;
            if (nums[mid] >= num) r = mid;
            //这个if一直找到比num小的数字,然后执行else刚好等于num(如果存在num的话)
            else l = mid + 1;
        }
        if (nums[l] != num) cout << "-1 -1" << endl;
        else {
            cout << l << ' ';
            int l = 0, r = nums.size() - 1;
            while(l < r) {
                int mid = l + r + 1 >> 1;
    			if (nums[mid] <= num) l = mid;
    			//同上,这里是找比num大的
    			else r = mid - 1;
            }
            cout << l << endl;
        }
    }
    int main() {
        vector<int> nums;
        int num, q;
        cin>> num >> q;
        for(int i = 0 ; i < num; i++) {
            int temp;
            cin >> temp;
            nums.push_back(temp);
        }
        for(int i = 0; i < q; i++) {
            int temp;
            cin >> temp;
            help(temp, nums);
        }
    }
posted @ 2022-08-13 23:01  天然气之子  阅读(198)  评论(0编辑  收藏  举报