2 条题解

  • 0
    @ 2024-11-4 10:24:01

    二分答案

    a1+...+aia_1+...+a_isum1sum1,ai+1+...ana_i+1+...a_nsum2sum2,很明显题解是求min(|sum1-sum2|). 根据i的增大,sum1-sum2很明显具有单调性,二分sum2sum1 sum2 \le sum1 的位置,再让当前位置减一则是sum1sum2sum1 \le sum2的位置,分别求出两个位置的答案,求最小值即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long 
    int a[200005];
    int jc[200005];
    const int mod =1e9+7;
    int l1,r1;
    bool check(int x)//判断
    {
      int sum1=(x-l1+1)*(l1+x)/2;//等差数列求和
      int sum2=(r1-x)*(r1+x+1)/2;
      if(sum1>=sum2)
      {
        return 1;
      }
      else
      return 0;
    }
    signed main()
    {
      int t;
      cin >> t;
      while(t--)
      {
        int o,p;
        cin >> o >> p;
        l1=p,r1=p+o-1;
        int l=l1,r=r1;
        while(l<=r)//二分
        {
         int mid=(l+r)/2;
         if(check(mid))
         {
           r=mid-1;
         }
         else
         l=mid+1;
        } 
      r=r+1;
      int sum1=(r-l1+1)*(l1+r)/2;
      int sum2=(r1-r)*(r1+r+1)/2;
      int ans=0;
      ans=abs(sum1-sum2);
      r--;
      sum1=(r-l1+1)*(l1+r)/2;
      sum2=(r1-r)*(r1+r+1)/2;
      ans=min(ans,abs(sum1-sum2));
        cout <<ans<<'\n';
      }
    }
    

    信息

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