C. C. Blog

Security Research, Algorithm and Data Structure

51Nod 1278 相离的圆

Problem

平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。

例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} {2, 3} {2, 4} {3, 4}这5对都有交点,只有{1, 4}是相离的。

Solution

注意圆心在坐标轴上,之前因为没看到这句话把题跳了。 然后就可以转化为线段,按照左端点排序,i代表线段循环,二分求左端点在第i条线段右端点左边的最后一个线段,他后面的线段就是相离的,加入答案。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define io_opt std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int n,ans;
struct E{
int s,t;
}e[50020];
int cmp(E x,E y){
if(x.s==y.s) return x.t<y.t;
return x.s<y.s;
}
int main(){
//io_opt;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x,r;
scanf("%d%d",&x,&r);
e[i].s=x-r;
e[i].t=x+r;
}
sort(e+1,e+1+n,cmp);
for(int i=1;i<=n;i++){
int l=i,r=n,mid,tmp=i;
while(l<=r){
mid=(l+r)>>1;
if(e[mid].s<=e[i].t){
l=mid+1;
tmp=mid;
}
else{
r=mid-1;
}
}
ans+=n-tmp;
}
printf("%d\n",ans);
return 0;
}
  • 本文作者: CCWUCMCTS
  • 本文链接: https://ccwucmcts.github.io/posts/42603/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!