三分§

对于凹函数来说,如果 check(lmid) <= check(rmid) 意味着极值点一定在 rmid 左侧。

因为此时 lmidrmid 要么都在极值点右侧要么极值点再两者之间,不过无论如何,极值点都不可能在 rmid 右侧。

因此就可以缩小区间。

当然 lmid 同理,凸函数也同理。

时间复杂度为 O(log(3n))

凹函数§
#include <bits/stdc++.h>

int main() {
    int l = -1000, r = 1000;

    auto check = [&](int u) -> int { return u * u + 1000; };

    while (l < r) {
        int lmid = l + (r - l) / 3, rmid = r - (r - l) / 3;
        if (check(lmid) <= check(rmid))
            r = rmid - 1;
        else {
            l = lmid + 1;
        }
    }

    std::cout << l << ' ' << check(l) << '\n';

    return 0;
}
凸函数§
#include <bits/stdc++.h>

int main() {
    int l = -1000, r = 1000;

    auto check = [&](int u) -> int { return -u * u + 1000; };

    while (l < r) {
        int lmid = l + (r - l) / 3, rmid = r - (r - l) / 3;
        if (check(lmid) >= check(rmid))
            r = rmid - 1;
        else {
            l = lmid + 1;
        }
    }

    std::cout << l << ' ' << check(l) << '\n';

    return 0;
}