列表

详情


NC26155. F. 无交集的圆

描述

Y轴上有许多圆,所有圆的圆心位于Y轴,求有多少对圆是没有交集的(不包含、不相交、不相切)。

输入描述

第1行:一个整数N,表示圆的数量(1 <= N <= 100000)
以下N行:每行2个浮点数P,R。P表示圆心的位置,R表示圆的半径(1 <= P, R, P-R, P+R <= 100000),题目保证圆与X轴的两个交点为整数点。

输出描述

输出满足条件的圆的对数。

示例1

输入:

3
2 1
5 1
8 1

输出:

3

示例2

输入:

4
1.5 0.5
3.5 0.5
5.5 0.5
7.5 0.5

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 172ms, 内存消耗: 3672K, 提交时间: 2019-06-04 09:13:55

#include<iostream>
#include<algorithm>
#define MAX 100010
using namespace std;
int n;
double p,r,a[MAX],b[MAX];
int main(){
	int cnt=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p>>r;
		a[i]=p-r;
		b[i]=p+r;
	}
	sort(a,a+n);
	for(int i=0;i<n;i++)
		cnt+=(a+n)-upper_bound(a,a+n,b[i]);
	cout<<cnt;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 194ms, 内存消耗: 2812K, 提交时间: 2019-06-03 21:33:58

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[100005],b[100005],n;
	double p,r;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p>>r;
		a[i]=p-r;
		b[i]=p+r; 
	}
	sort(a,a+n);
	int cnt=0;
	for(int i=0;i<n;i++){
		int p=upper_bound(a,a+n,b[i])-a;
		cnt+=n-p;
	}
	cout<<cnt;
	return 0;
}

上一题