zoukankan      html  css  js  c++  java
  • BZOJ3834:Solar Panels (分块)

    题意

    询问两个区间[smin,smax],[wmin,smax]中是否存在k的倍数,使得k最大

    分析

    将其转化成([frac{smin-1}k,frac{smax}k],[frac{wmin-1}k,frac{wmax}k])
    用分块思想做,注意到这只有(O(sqrt{n}))种取值,于是可以分段计算,做到(O(sqrt{n}))每次询问
    我的理解:每一块为[i,j],j=b/(b/i)表示该块的最右端,而i表示该块的最左端,b在[i,j]上的值b/i相同

    trick

    代码

    //每个块的范围是[i,j],而且每次由i求出j,每次判断更新答案
    #include<iostream>
    #include<cstdio>
    using namespace std;
    void doit()
    {
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        a--;c--;
        int i,j,ans;
        if(d>b) swap(b,d),swap(a,c);
        for(i=1;i<=d;i=j+1)
        {
            j=min(b/(b/i),d/(d/i));
            if(i<=a) j=min(j,a/(a/i));
            if(i<=c) j=min(j,c/(c/i));
            if(b/i>a/i&&d/i>c/i) ans=j;
        }
        printf("%d
    ",ans);
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--) doit();
    }
    
  • 相关阅读:
    MVC三层架构
    JavaScript,你好!(二)
    HTML你好!
    Typora,你好!
    安装mysqlmysql-5.7.24-linux-glibc2.12-x86_64
    sizeof与strlen的区别
    printf格式化输出
    java泛型讲解
    双系统删除Linux系统
    kali破解wifi密码
  • 原文地址:https://www.cnblogs.com/chendl111/p/7076604.html
Copyright © 2011-2022 走看看