BZOJ-3834: [Poi2014]Solar Panels

[文章目录]

Description

n组询问,每次问smin<=x<=smax, wmin<=y<=wmax时gcd(x, y)的最大值。1<=N<=1000 ;1<=Smin<=Smax<=10^9,1<=Wmin<=Wmax<=10^9。

假设答案为ans,那么则有
分块找合法最大的ans。理论上取下整也可行,但是取上整遇到解直接跳出会很快。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline int cie(int x,int y)
{
    return x%y?x/y+1:x/y;
}
int main()
{
    int t,l1,l2,r1,r2,b,e,ans;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        r1++; r2++; ans=1; b=min(r1,r2);
        e=max( max(cie(r1,cie(r1,b)) , cie(l1,cie(l1,b)) ) , max(cie(r2,cie(r2,b)) , cie(l2,cie(l2,b)) ) );
        while(b>=1)
        {
            if(cie(r1,b)>cie(l1,b)&&cie(r2,b)>cie(l2,b))
            {
                ans=b;
                break;
            }
            b=e-1;
            e=max( max(cie(r1,cie(r1,b)) , cie(l1,cie(l1,b)) ) , max(cie(r2,cie(r2,b)) , cie(l2,cie(l2,b)) ) );
        }
        printf("%d\n",ans);
    }
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注