这里的相离竟然不包括内含….坑….
num=n,sum=0;
num是代表现在还有多少个圆没有出现过。
sum代表外离的对数。
那么每次
直接遇圆左就num–;
圆右就sum+=num;
处理完,即为答案
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int read(){int ret=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';return ret;}
struct t
{
int a,b;
}p[100050];
bool cmp(t x,t y)
{
if(x.a!=y.a)
return x.a<y.a;
return x.b<y.b;
}
int main()
{
int n=read(),x,r;
n<<=1;
for(int i=0;i<n;i++)
{
x=read(),r=read();
p[i].b=0;
p[i++].a=x-r;
p[i].b=1;
p[i].a=x+r;
}
sort(p,p+n,cmp);
int sum=0,num=n>>1;
for(int i=0;i<n;i++)
if(p[i].b) sum+=num;
else num--;
printf("%d\n",sum);
}

本文介绍了一种计算平面上多个圆之间的外离对数的方法。通过跟踪每个圆的出现状态并使用一种特殊的扫描线算法,有效地计算了任意两个圆不相交也不内含的情况数量。
3321

被折叠的 条评论
为什么被折叠?



