设 \(A<B\),\(C=\max(\sqrt{AB-1},A)\),答案为:
\[C-1+\frac{AB-1}{C+1} \]如果 \(A>B\) 时显然可以互换,接下来称 \(A\) 所在的比赛为第一场比赛,\(B\) 所在的比赛为第二场比赛。
显然一个人对应的两个名次相当于在匹配第一场和第二场比赛的两个名次。
首先,令 \(A-d\) 匹配 \(B+d\) 一定能够得到 \(A\) 组匹配。
对于第一场比赛中名次更大的。我们知道对于整除分块而言,当 \(i>\sqrt{n}\) 后 \(\lfloor\frac{n}{i}\rfloor\) 都会是连续的,因为 \(i\) 只能匹配 \(\lfloor\frac{AB-1}{i}\rfloor\) 及以下的,对于第二场比赛中排名为 \([1,C]\) 的而言一定能找到一个在第一场比赛的匹配。
而对于第一场比赛中间剩下的没匹配上的一定也能找到,因为对于 \(i<\sqrt{n}\) 有 \(\lfloor\frac{n}{i}\rfloor-\lfloor\frac{n}{i+1}\rfloor>=2\),所以一定能找到解。
而第一场剩下的人,编号最大的就是 \(C\)。
upd:傻逼sqrt掉精度还给我弄WA了,只能手写一个/fn
#include<iostream>
inline int sqrt(const long long&n){
int L(1),R(1000000000),mid,ans(0);while(L<=R)mid=L+R>>1,1ll*mid*mid<=n?L=mid+1,ans=mid:R=mid-1;return ans;
}
signed main(){
int T,A,B,C;std::cin>>T;
while(T--)std::cin>>A>>B,A>B&&(std::swap(A,B),0),C=std::max(int(sqrt(1ll*A*B-1)),A),std::cout<<C-1+(1ll*A*B-1)/(C+1)<<'\n';
}
标签:std,匹配,比赛,int,题解,sqrt,第一场,ARC094D
From: https://www.cnblogs.com/lmpp/p/16592808.html