3 条题解

  • 0
    @ 2025-10-4 0:49:07

    写了个开区间二分,感觉在需要函数二分时比较好理解

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    int t, n, k, sum;
    
    void solve() {
        cin >> n >> k;
        int l = max(-1ll, n / 2 - 1), r = n;
        const int sum = (2 * k + n - 1) * n / 2;
        auto f = [&](int m) {
            return (2 * k + m) * (m + 1) - sum;
        };
        while (r - l > 1) {
            int mid = l + (r - l) / 2;
            if (f(mid) < 0) {
                l = mid;
            } else if (f(mid) > 0) {
                r = mid;
            } else {
                break;
            }
        }
        l = max(0ll, l), r = min(r, n - 1);
        cout << min(abs(f(l)), abs(f(r))) << '\n';
    }
    
    signed main() {
        cin >> t;
        while (t--) {
            solve();
        }
        return 0;
    }
    

    信息

    ID
    1048
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    28
    已通过
    8
    上传者