zoukankan      html  css  js  c++  java
  • 【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
    ", sum);
        return 0;
    }
  • 相关阅读:
    75
    74
    接口理论知识
    软件测试计划的编写
    软件测试的生命周期&软件测试工作流程
    软件测试分类体系系统学习
    Mysql之高级查询
    数据库的DML操作
    Mysql之数据完整性约束
    Mysql之DDL操作
  • 原文地址:https://www.cnblogs.com/lesroad/p/9345684.html
Copyright © 2011-2022 走看看