/*<=====头文件,命名空间和宏定义=====>*/
#include <bits/stdc++.h>
#define rl(i) rec[order[i]].length
#define rw(i) rec[order[i]].width
using namespace std;
/*<==============基础定义==============>*/
struct rectangle {
int length, width;
} rec[4];//长方形们
int order[4] = {0, 1, 2, 3};//排列顺序,初始时有序
int ans = 2e9;//答案,初始时设为极大值
set<pair<int, int> > mp;
vector<pair<int, int> > res;
/*<==============函数定义==============>*/
inline void init();//输入
inline void part1();//排列方案1
inline void part2();//排列方案2
inline void part3();//排列方案3
inline void part4();//排列方案4
inline void part5();//排列方案5
inline void part6();//排列方案6
inline void update(int, int);//更新答案
inline void do_it();//工作
inline void work(int);//工作
inline void solve();//解答
/*<==============主函数==============>*/
int main() {
init();
solve();
return 0;
}
inline void init() {
for (int i = 0; i < 4; i++)
scanf("%d%d", &rec[i].length, &rec[i].width);
}
inline void update(int length, int width) {
if (length > width)
swap(length, width);
if (length * width > ans || mp.count(make_pair(length, width)) > 0)
return;
/*<================以上情况不用更新!================>*/
//更新
if (length * width == ans) {
mp.insert(make_pair(length, width));
res.push_back(make_pair(length, width));
return;
}
ans = length * width;
res.clear();
mp.insert(make_pair(length, width));
}
inline void part1() {
update(rl(0) + rl(1) + rl(2) + rl(3), max(max(rw(0), rw(1)), max(rw(2), rw(3))));
}
inline void part2() {
update(max(rl(0) + rl(1) + rl(2), rl(3)), max(rw(0), max(rw(1), rw(2))) + rw(3));
}
inline void part3() {
update(max(rl(0) + rl(1), rl(2)) + rl(3), max(rw(3), max(rw(0), rw(1)) + rw(2)));
}
inline void part4() {
update(rl(0) + max(rl(1), rl(2)) + rl(3), max(rw(3), max(rw(0), rw(1) + rw(2))));
}
inline void part5() {
update(max(rl(0), rl(1)) + rl(2) + rl(3), max(max(rw(0) + rw(1), rw(2)), rw(3)));
}
inline void part6() {
//比较复杂,慢慢来
int length;
if (rw(2) >= rw(1) + rw(3))
length = max(max(rl(0), rl(1) + rl(2)), rl(2) + rl(3));
else if (rw(3) < rw(2))
length = max(rl(0) + rl(1), max(rl(1), rl(3)) + rl(2));
else if (rw(2) == rw(3))
length = max(rl(0) + rl(1), rl(2) + rl(3));
else if (rw(2) < rw(3) && rw(3) < rw(2) + rw(0))
length = max(rl(0) + rl(1), max(rl(0), rl(2)) + rl(3));
else if (rw(3) >= rw(0) + rw(2))
length = max(rl(1), max(rl(0), rl(2)) + rl(3));
update(length, max(rw(0) + rw(2), rw(1) + rw(3)));
}
inline void do_it() {
part1();
part2();
part3();
part4();
part5();
part6();
}
inline void work(int depth) {
if (depth == 5) {
do_it();
return;
}
for (int i = 0; i < 4; i++) {
work(depth + 1);//下一种排列
swap(rec[i].length, rec[i].width);//旋转
work(depth + 1);//下一种排列
swap(rec[i].length, rec[i].width);//回溯
}
}
inline void solve() {
do
work(1);
while (next_permutation(order, order + 4));
printf("%d\n", ans);
sort(res.begin(), res.end());
for (int i = 0; i < res.size(); i++)
printf("%d %d\n", res[i].first, res[i].second);
}
吃饭中,at我一会儿回