Solution 4

#include"cmath"
#include"stdio.h"
#include"algorithm"
#include"vector"
#include"cassert"
using namespace std;
long double l1, l2;
const long double pi = acos(-1);
const long double root3 = tan(pi/3);
long double max(long double a, long double b) {
return a<b?b:a;
}
long double eval(long double theta) {
long double h = max(l1, l2) * sin(pi/3+theta);
long double b1 = max(0.0, l1*cos(2*pi/3-theta));
long double b2 = l2*root3 / (2*sin(theta));
b2 = max(b2, l1*cos(theta));
b2 = max(b2, cos(theta)*(l2/2 + l2*root3/(2*tan(theta))));
return h*(b1+b2);
}
vector<long double> angles() {
vector<long double> ret;
ret.push_back(pi/6);
if(2*l1>l2) {
long double theta = atan(l2*root3/(2*l1-l2));
if(theta>=0 and theta <= pi/3)
ret.push_back(theta);
}
if(l2*root3<=l1) {
long double theta = 0.5 * asin(l2*root3/l1);
if(theta>=0 and theta <= pi/3)
ret.push_back(theta);
}
ret.push_back(pi/4);
ret.push_back(0);
ret.push_back(pi/3);
sort(ret.begin(), ret.end());
return ret;
}
long double fn(long double d) {
return (root3/4)*(l1+d)*(2*l2+l1-d);
}
long double solve() {
if(l1>=2*l2 or l2>=2*l1) return max(l1*l1, l2*l2)*root3/2;
assert(fn(max(l2-l1, 0.0)) <= fn(min(2*l2-l1, l1))+1e-6);
long double cand = min(fn(max(l2-l1, 0.0)), fn(min(2*l2-l1, l1)));
//return fn(max(l2-l1, 0.0));
//printf(" %Lf %Lf %Lf\n", min(2*l2-l1, l1), l1, l2);
vector<long double> ang = angles();
//printf("cand %.9Lf\n", cand);
for(long double theta: ang) cand = min(cand, eval(theta));
//printf("cand %.9Lf\n", cand);
for(int i=1; i<ang.size(); i++) {
long double lo = ang[i-1], hi = ang[i];
while(hi-lo>1e-5) {
long double a = lo + (hi-lo)/10, b = hi+lo-a;
if(eval(hi)>eval(lo)) hi = b; else lo = a;
}
cand = min(cand, eval(lo));
cand = min(cand, eval(hi));
}
//printf("cand final %.9Lf\n", cand);
return cand;
}
long double getAns() {
long double d1 = solve();
swap(l1, l2);
return min(d1, solve());
}
int main () {
int T;
scanf("%d", &T);
assert(T <= 1000);
while(T--) {
scanf("%Lf %Lf", &l1, &l2);
assert(l1 >= 1 and l1 <= 100);
assert(l2 >= 1 and l2 <= 100);
printf("%.3Lf\n", getAns());
}
}