【C++竞赛 F】yyy的三角形

时间限制:2s 内存限制:32MB
问题描述
yyy对三角形非常感兴趣,他有n个木棍,他正在用这些木棍组成三角形。这时xxx拿了两根木棍过来,xxx希望yyy能给他一根木棍,使得xxx可以组成一个三角形。yyy想知道他有多少根木棍满足xxx的要求。
输入描述
第一行一个整数T(1≤T≤5)表示数据组数。
对于每组数据第一行两个整数n(1≤n≤〖10〗^5 ),q(1≤q≤〖10〗^5),分别表示yyy的木棍数量和xxx的询问次数。第二行n个用空格分开的整数L_i (1≤L_i≤〖10〗^9),分别表示yyy的n根木棍的长度。接下来q行,每行两个整数a,b(1≤a,b≤〖10〗^9),表示xxx每次询问两根木棍的长度。
输出描述
对于每组数据,输出q行,每行一个整数表示答案。
输入样例
1
7 2
2 8 5 1 10 5 9
3 9
6 5
输出样例
3
6

【题目链接】:

【题解】

三角形的三边要满足
a+b>c
a+c>b
b+c>a
则转换一下就是

    max(a-b,b-1)<c<a+b


排序后用二分搞出两个端点就可以了;

【完整代码】

#include <bits/stdc++.h>
#define rep1(i,a,b) for (int i = a;i <= b;i++)
using namespace std;
#define pb push_back;

const int MAXN = 1e5+100;

int n,q;
int c[MAXN];

int main()
{
    //freopen("D:\\rush.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d%d",&n,&q);
        rep1(i,1,n)
            scanf("%d",&c[i]);
        sort(c+1,c+1+n);
        rep1(i,1,q)
        {
            int L,R,a,b;
            scanf("%d%d",&a,&b);
            L = max(b-a,a-b);
            R = a+b;
            int l = 0,r = n,ans1=0;
            while (l <= r)
            {
                int m = (l+r)>>1;
                if (L<c[m])
                {
                    ans1 = m;
                    r = m-1;
                }
                else
                    l = m+1;
            }

            l = 0,r = n;
            int ans2=0;
            while (l <= r)
            {
                int m = (l+r)>>1;
                if (c[m]<R)
                {
                    ans2 = m;
                    l = m+1;
                }
                else
                    r = m-1;
            }
            printf("%d\n",ans2-ans1+1);
        }
    }
    return 0;
}
posted @ 2017-10-04 18:45  AWCXV  阅读(151)  评论(0)    收藏  举报