2 条题解
-
0
二分答案
令 为,为,很明显题解是求min(|sum1-sum2|). 根据i的增大,sum1-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
- 上传者