【CodeForces - 1034B】Little C Loves 3 II
@中文题意@
n*m的矩阵,当两个点(x1, y1)与(x2, y2)曼哈顿距离为3时可以将两个点匹配。每个点只能够与一个点匹配。求最多能可以匹配多少个点。
n,m <= 10^9
(xi,yi) and (xj,yj) is defined as |xi−xj|+|yi−yj|.
@分析@
【这种题也只能够手算小数据来找规律……】
首先弄清楚一个上界:对于任意的n∗mn∗m n*mn∗m矩阵,如果n与m都为奇数,则答案最大为nm-1;否则答案最大为nm。
不妨假设n <= m。
当 n = 1 的时候,我们只能横着进行匹配。我们手算几组数据,可以用如下图的方法可以把1∗61∗6 1*61∗6所有点都匹配。
再手算几组,我们发现这样一个规律:对于任意一个1∗m1∗m 1*m1∗m,如果m%6<=3,则能匹配的点数为m-m%6;否则能匹配的点数为m-6+m%6。
【具体的证明应该可以用归纳法证明,请容许我偷一下懒qwq】
当 n = 2 的时候。2∗22∗2 2*22∗2显然无解,2∗32∗3 2*32∗3的矩阵中间那一列的元素没有任何元素能跟它们匹配,所以最大匹配点数也只能为4。2∗42∗4 2*42∗4,2∗52∗5 2*52∗5可以采用下列所示的方法全部匹配完。
2∗62∗6 2*62∗6矩阵可以把它拆成两个1∗61∗6 1*61∗6的矩阵,每个矩阵内部可以全部匹配完。
然后!学长们就是被2∗72∗7 2*72∗7的矩阵卡掉了。实际上2∗72∗7 2*72∗7不能构造出全部匹配的情况的。如图:两个蓝色块只能与两个紫色块匹配,所以紫色块只能与蓝色块匹配。同理,两个红色块只能与两个棕色块匹配,所以棕色块只能与红色块匹配。然后有一个块既要和蓝色块匹配又要和棕色块匹配,所以不可能~
所以2∗72∗7 2*72∗7最多只能配对12个点。
然后,最关键的来了。对于一个2∗m2∗m 2*m2∗m(m>=7),如果m为偶数,我们可以把m拆成若干个4与6的和,即将原矩阵拆成若干个2∗42∗4 2*42∗4矩阵与2∗62∗6 2*62∗6矩阵。对于这些矩阵我们可以把所有点匹配完,所以我们自然也就可以匹配完2∗m2∗m 2*m2∗m的所有点;反之,如果m为奇数,我们可以先将2∗m2∗m 2*m2∗m分成2∗52∗5 2*52∗5与