# E题 Klee's SUPER DUPER LARGE Array!!!

题目描述

image
image

思路:

对于这道题,首先观察到题目求的是最小可能值,而且数据的范围是1e9范围,所以首先可以考虑的方法就是O(logn)的方法,而适合求最值的方法无疑就是二分搜索,可以通过二分来不断缩小答案的区间来求出最终的答案。

点击查看代码
#include <iostream>  
#include <cmath>  
using namespace std;
int n, k;
auto sum(long long a, long long b) {
    return ((b - a + 1) * (a + b)) >> 1;
}
void solve()
{
    int l = 0, r =n-1;
    while (l+1<r)
    {
           int m = (l+r)>>1;
            auto s1 = sum(k, k+m);
            auto s2 = sum(k+m+1, k+n-1);
            if (s2 - s1 > 0) {
                l = m;
            } else {
                r = m;
            }
    }
    cout << min(abs(sum(k, k + l) - sum(k + l + 1, k + n - 1)), abs(sum(k, k + r) - sum(k + r + 1, k + n - 1))) << endl;
}
int main() {
    int t;
    cin >> t;
    while (t--) {
        cin >> n >> k;
        solve();
    }
    return 0;
}

提示

在不断缩小答案范围的过程中,如果后面的项和大于前面的项之和,我们的目的是让两个的值尽可能接近,所以要把后面的项和减小,同时前面的项和增大,就是把mid=l,而前面项大于后面项者同理,最后比较l和r的答案的大小即输出

 posted on 2024-09-04 16:40  熙玺  阅读(202)  评论(0编辑  收藏  举报

Shu-How Zの小窝

Loading...