【BZOJ】3834:[Poi 2014]Solar Panels
1340 ワード
http://www.lydsy.com/JudgeOnline/problem.php?id=3834
MAX\((i,j)\)を求めて、sman<=i==smax、wmin<=i==wmaxドル、ここで$smax<=10^9、wmin<=10^9$、あります。N<=1000ドル組のデータがあります。
$smax==wmaxを仮定します
wmin(=smax(=wmax)なら、明らかな答えは$smaxです。
エニュメレート・d=gcd$を考慮して、区間でのドル(\lflor\frar{smin}{d}\r flor、\lflor\frac{d}と[lflor]\flar{d}flashとr{d}があります。
そこで私はとてもsbになりました。……なぜ私は$((i,j)=1ドルを必要としたのですか???そしてzyf千古神犇を拝みました。実は、[(i,j)]==1ドルでいいのですか???私はsbとは思いませんでした。倍数関係です。
ブロックに分けて検索すればいいです。
複雑度$O(N 4\sqrt{smax}$
MAX\((i,j)\)を求めて、sman<=i==smax、wmin<=i==wmaxドル、ここで$smax<=10^9、wmin<=10^9$、あります。N<=1000ドル組のデータがあります。
#include <bits/stdc++.h>
using namespace std;
int main() {
int cs, smin, smax, wmin, wmax, ans; scanf("%d", &cs);
while(cs--) {
scanf("%d%d%d%d", &smin, &smax, &wmin, &wmax);
if(smax>wmax) swap(smin, wmin), swap(smax, wmax);
ans=1;
if(wmin<=smax && smax<=wmax) ans=smax;
else {
--smin; --wmin;
for(int d=smax, pos; d; d=pos) {
pos=max(smax/(smax/d+1), wmax/(wmax/d+1));
if(smin>=d) pos=max(pos, smin/(smin/d+1));
if(wmin>=d) pos=max(pos, wmin/(wmin/d+1));
if(smax/d-smin/d>0 && wmax/d-wmin/d>0) { ans=d; break; }
}
}
printf("%d
", ans);
}
return 0;
}
$smax==wmaxを仮定します
wmin(=smax(=wmax)なら、明らかな答えは$smaxです。
エニュメレート・d=gcd$を考慮して、区間でのドル(\lflor\frar{smin}{d}\r flor、\lflor\frac{d}と[lflor]\flar{d}flashとr{d}があります。
そこで私はとてもsbになりました。……なぜ私は$((i,j)=1ドルを必要としたのですか???そしてzyf千古神犇を拝みました。実は、[(i,j)]==1ドルでいいのですか???私はsbとは思いませんでした。倍数関係です。
ブロックに分けて検索すればいいです。
複雑度$O(N 4\sqrt{smax}$