这题的话看别人做的很巧妙、
把起点和终点放在一起去排序,如果起点和终点相同就起点在前面
然后定义一个num=n 代表有n个圆,一个sum代表最后求的的结果,
如过碰到起点就num--,碰到重点就sum+=num,加上num是因为这个终点后面还有num个起点,且这些起点的x坐标都比当前终点坐标要大
我的思路是先对终点坐标进行排序,然后枚举每一个起点坐标二分查找小于它的第一个终点的位置、
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const int qq = 50050;
int l[qq],r[qq];
struct Circle{
int l,r;
bool operator < (const Circle &a){
return r<a.r;
}
}circle[qq];
int main(){
int n;scanf("%d",&n);
int x,R;
for(int i=0; i<n; ++i){
scanf("%d%d",&x,&R);
circle[i].l = x-R;
circle[i].r = x+R;
}
sort(circle, circle+n);
for(int i=0; i<n; ++i) r[i]=circle[i].r;
ll ans=0;
for(int i=0; i<n; ++i)
ans+=lower_bound(r, r+n, circle[i].l)-r;
printf("%lld\n", ans);
return 0;
}