BZOJ3834 : [Poi2014]Solar Panels

问题相当于找到一个最大的k满足在$[x_1,x_2]$,$[y_1,y_2]$中都有k的倍数

等价于$frac{x_2}{k}>frac{x_1-1}{k}$且$frac{y_2}{k}>frac{y_1-1}{k}$

注意到这只有$O(sqrt{n})$种取值,于是可以分段计算,做到$O(sqrt{n})$每次询问

#include<cstdio>
int T,a,b,c,d,i,j,t;
inline void up(int&a,int b){if(a>b)a=b;}
int main(){
  for(scanf("%d",&T);T--;printf("%d
",t)){
    scanf("%d%d%d%d",&a,&b,&c,&d),a--,c--;
    if(b>d)t=a,a=c,c=t,t=b,b=d,d=t;
    if(d/b>c/b)t=b;else for(i=1;i<=b;i=j+1){
      j=b/(b/i),up(j,d/(d/i));
      if(i<=a)up(j,a/(a/i));
      if(i<=c)up(j,c/(c/i));
      if(b/j>a/j&&d/j>c/j)t=j;
    }
  }
  return 0;
}

  

原文地址:https://www.cnblogs.com/clrs97/p/4403168.html