可以发现我们不用管什么权值递增,只要保证横着放的长度互不相同就可以
把权值看成点,一个矩形就是在长和宽之间连一条边
那么我们就要给每条边定一个向,保证每个点出度最多为1,一条有向边的权值就等于其指向的点的权值,最大化边权和
因为题目保证了有解,所以每个连通块要么是树,要么是环套树
因为如果一个连通块里有两个环的话那么至少有一个点出度为二
证明就是如果所有点出度都<=1的话那就是环套树了,只有一个环,矛盾
我们把边对答案的贡献转换到点上,对于环套树连通块,每个点的贡献就是(度数-1)乘权值,对于树的连通块,令权值最大的点为根,他还可以额外做点权那么多的贡献
#include<iostream>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<ioma