求出每一个圆的的左右区间
先根据左区间sort
然后题目就可以变成区间相交
遍历一次,然后二分搜索大于当前右区间的最小左区间下表。
就可以求出来最小下表,后面的都是不相交的
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
using namespace std;
typedef struct node{
int zuo,you;
}node;
bool cmp(node n1,node n2){
return n1.zuo<n2.zuo;
}
node no[50001];
int f(int i,int you){
int zuo=i;
int flag=0;
int index=0;
while(zuo<=you){
int mid=(zuo+you)/2;
if(no[mid].zuo>no[i].you){
flag=1;
index=mid;
you=mid-1;
}
else zuo=mid+1;
}
if(flag) return index;
return -1;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
no[i].zuo=a-b;
no[i].you=a+b;
}
sort(no,no+n,cmp);
int sum=0;
for(int i=0;i<n;i++){
int index=f(i,n);
if(index!=-1){
sum+=n-index;
}
}
cout<<sum;
return 0;
}