设 \(m\) 为 \(a_1+\dots+a_i\),\(n\) 为 \(a_{i+1}+\dots+a_n\)。
我们可以使用二分查找来搜索 \(i\),使得 \(m-n\) 为最小的负数。
如果我们移动到 \(i+1\),则此时 \(m-n\) 为最小的整数。答案是两种情况下的最小绝对值。
代码:
#include<bits/stdc++.h>
using namespace std;
pair<long long ,long long >val(long long mid,long long k,long long n){
long long val1=(mid+k-1+k)*mid/2;
long long val2=(k+n-1+k)*n/2-val1;
return{val1,val2};
}
int main(){
int t;
cin>>t;
while(t--){
long long n,k;
cin>>n>>k;
long long lo=1,hi=n,curr=1;
while(lo<=hi){
long long mid=(lo+hi)/2;
auto[a,b]=val(mid,k,n);
if(b>a){
curr=mid;
lo=mid+1;
}else{
hi=mid-1;
}
}
auto[a1,b1]=val(curr,k,n);
auto[a2,b2]=val(curr+1,k,n);
cout<<min(b1-a1,a2-b2)<<endl;
}
return 0;
}
标签:curr,Klee,int,题解,DUPER,mid,long,val1
From: https://www.cnblogs.com/cly312/p/18444983