2019-2020 ICPC, Asia Jakarta Regional Contest H. Twin Buildings


题意:n个矩形,每个矩形长Li,宽Wi,
要在这些矩形里面建两个一毛一样的矩形,两种方式:
1,从n种里面选一种在里面建造两个矩形(肯定选最大的哪个啦)
2,从n种里选两个各在里面建一个矩形(建的矩形长宽都是两个矩形中的最小值)

考虑方法2,
如果要在一个矩形里面建造矩形,新矩形的长和宽都是未知的(就很麻烦就
所以我们通过排序,控制一个变量使他已知(使可建造的矩形宽肯定等于当前矩形,就要排序使遍历他之前的矩形宽都大于等于当前矩形)
为了避免精度损失使用LL。
int n;
ll l,w;
vector<pii >v;
int cmp(pii a,pii b){return a.second>b.second;}
int main()
{
    rd(n);
    ll ans=0;
    for(int i=0;i<n;++i)
    {
        rd(l),rd(w);ans=max(ans,l*w);
        if(l>w) swap(l,w);
        v.push_back({l,w});
    }
    sort(v.begin(),v.end(),cmp);
    //w降序排列,对于如果拿当前枚举到的矩阵和其他一个矩阵组成
    //该矩阵前面的矩阵w肯定都大于当前的w
    //那么从以前的最大的l与当前的矩阵组成俩矩阵
    ll mxl=v[0].first;
    for(int i=1;i<n;++i)
    {
        ans=max(ans,v[i].second*min(v[i].first,mxl)*2);
        mxl=max(mxl,v[i].first);
    }
    if(ans%2) printf("%lld.5\n",ans/2);
    else printf("%lld.0\n",ans/2);
    //stop;
    return 0;
}