CSU1204-Rectangles-二分

探讨了在限定条件下,寻找符合条件的不同矩形数量的问题。通过二分搜索算法确定矩形边长的有效范围,实现了高效求解。

X: Rectangles

Description

如果限定矩形的边长必须为整数,且周长为定值L,那么面积在[A, B]范围内不同的矩形一共有多少个呢?

在这个问题中,当且仅当两个矩形面积不同时,视作是两个不同的矩形。

Input

输入数据的第一行包含一个整数T (1 <= T <= 10000),表示接下来一共有T组测试数据。

对于每组测试数据,包含三个整数L (1 <= L <= 2,000,000,000)、A、B (1 <= A <= B <= 250,000,000,000,000,000),含义同上。

Output

对于每组测试数据,用一行输出一个整数,代表上述问题的答案。

Sample Input

3
11 1 6
12 5 10
12 8 10

Sample Output

0
3
2

这么大的数据范围,当然是选择二分啦
就是二分找到边长的上下限,做差+1就是结果啦,因为边长只能是整数,具体的看代码体会吧

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    long long a,b,l,maxn,minn,s,n,low,high,mid;
    cin>>n;
    while(n--){
        cin>>l>>a>>b;
        maxn=0;
        minn=0;
        if(l&1||l<4){
            cout<<0<<endl;
            continue;
        }else{
            low=0,high=l/4;
            while(high>=low){
                mid=(high+low)/2;
                if(mid*(l/2-mid)<a){
                    minn=max(minn,mid);
                    low=mid+1;
                }else{  
                    high=mid-1;
                }
            }
//          cout<<low<<' '<<mid<<' '<<minn<<' ';
            low=1,high=l/4;
            while(high>=low){
                mid=(high+low)/2;
                if(mid*(l/2-mid)<=b){
                    maxn=max(maxn,mid);
                    low=mid+1;
                }else{
                    high=mid-1;
                }
            }
//          cout<<low<<' '<<mid<<' '<<maxn<<' ';
            cout<<(maxn-minn>0?maxn-minn:0)<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值