平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。
例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} {2, 3} {2, 4} {3, 4}这5对都有交点,只有{1, 4}是相离的。
Input
第1行:一个数N,表示圆的数量(1 <= N <= 50000)
第2 - N + 1行:每行2个数P, R中间用空格分隔,P表示圆心的位置,R表示圆的半径(1 <= P, R <= 10^9)
Output
输出共有多少对相离的圆。
Input示例
4
1 1
2 1
3 2
4 1
Output示例
1
思路: 由于圆心都在y轴上,所以我们可以把圆转化为线段,线段的前端点为pre,后端点post,然后按pre从小到大排序。利用二分找到第一个大于每一个线段pre的位置即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif //LOCAL
ios_base::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
int n;
cin>>n;
int a,b;
vector<int> pre,post;
for(int i=0;i<n;i++)
{
cin>>a>>b;
pre.push_back(a-b);
post.push_back(a+b);
}
sort(pre.begin(),pre.end());
int ans = 0;
for(int i=0;i<n;i++)
ans+=pre.end()-upper_bound(pre.begin(),pre.end(),post[i]);
cout<<ans<<endl;
return 0;
}