51NOD 1278 相離的圓 二分 排序

2022-04-05 07:32:40 字數 1415 閱讀 7176

平面上有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中間用空格分隔,...