【51nod-1278】相离的圆(二分)
思路
做法就是先把圆的直径化成线段,然后将线段的起点从小到大排序,以第i条线段为例,找i+1~n条中这样一条线段,满足是第一条且起点比第i条的终点要大(即满足相离),那么包括这条线段之后的线段也满足和第i条线段相离。顺序查找的话可以用二分来提高时间效率。
code
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 50005; struct node { int a, b; } q[N]; bool cmp(node x, node y) { if(x.a == y.a) return x.b < y.b; return x.a < y.a; } int B_S(int l, int r, int x) { while(l <= r) { int mid = (l+r)>>1; if(q[mid].a > x) r = mid-1; else l = mid+1; } return l; } int main() { int n, a, b; cin>>n; for(int i=0; i<n; i++) { scanf("%d%d", &a, &b); q[i].a = a-b, q[i].b = a+b; } sort(q, q+n, cmp); int sum = 0; for(int i=0; i<n; i++) { int pos = B_S(i+1, n-1, q[i].b); sum = sum+n-pos; } printf("%d\n", sum); return 0; }