题解:CF2009E Klee's SUPER DUPER LARGE Array!!!

\(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;
}

posted @ 2024-10-02 18:57  cly312  阅读(34)  评论(0)    收藏  举报