NC26155. F. 无交集的圆
描述
输入描述
第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; }