平面上有n個圓,他們的圓心都在x軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。
例如:4個圓分別位於1, 2, 3, 4的位置,半徑分別為1, 1, 2, 1,那麼, 這5對都有交點,只有是相離的。
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 13 2
4 1output示例
1 解題思路:
因為他們都是在 x 軸上,所以我們可以將其轉為線段相交,因為要求的是圓相離的情況也就是轉化後的線段不相交的情況,我們可以將線段的終點按公升序排列,如果終點相等的話按起點公升序,然後二分查詢每乙個起點,找到終點大於起點的下標,每次sum+=下標就行了。
my code:
#include
#include
using namespace std;
const int maxn = 100000+5;
struct node
int left, right, flag;
}a[maxn];
inline bool cmp(node a, node b)
if(a.right != a.right)
return a.left < b.left;
return a.right < b.right;
int binary_search(int l, int r, int x)
int mid;
while(l < r)
mid = (l+r)>>1;
if(a[mid].right >= x)
r = mid-1;
else
l = mid+1;
while(l>0 && a[l].right>=x)
l--;
return l;
int main()
int n;
while(cin>>n)
int c, r, cnt = 0;
for(int i=1; i<=n; i++)
cin>>c>>r;
a[i].left = c-r;
a[i].right = c+r;
sort(a+1, a+n+1, cmp);
a[0].left = a[0].right = -1;
int ans = 0;
for(int i=1; i<=n; i++)
ans += binary_search(1, i, a[i].left);
cout<
return 0;
51nod 1278 相離的圓
題目 平面上有n個圓,他們的圓心都在x軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如 4個圓分別位於1,2,3,4的位置,半徑分別為1,1,2,1,那麼,這5對都有交點,只有是相離的。input 第1行 乙個數n,表示圓的數量 1 n 50000 第2 n 1行 每行2個數p,r中間用空格...
51 NOD 1278 相離的圓
1278 相離的圓 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 平面上有n個圓,他們的圓心都在x軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如 4個圓分別位於1,2,3,4的位置,半徑分別為1,1,2,1,那麼,這5對都有交點,只有是相離的。inpu...
51Nod 1278 相離的圓
平面上有n個圓,他們的圓心都在x軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如 4個圓分別位於1,2,3,4的位置,半徑分別為1,1,2,1,那麼,這5對都有交點,只有是相離的。input 第1行 乙個數n,表示圓的數量 1 n 50000 第2 n 1行 每行2個數p,r中間用空格分隔,...