11.23A组 T3----color
Solution
m显然有上界:怎么求?
显然每一列每种颜色填两次最优。
那么若某一行有x个位置颜色为c,这些位置所在列填的另一个c不能有两个在同一行,那么$ x\leq 2n-1 $ ;有 n 种颜色,那么$ m\leq n*(2n-1) $ 。
若能达到上界则最优。怎么构造呢?
原题解:
然后我们这样染色:先找到$ 1 $ 至 $ 2n $ 的一组匹配,然后每组匹配点的颜色要求相同,我们先给第一组染一号色,第二组染二号……然后我们环移一次后再染,一共能产生$ n $ 组合法的对列的染色方案
接下来就是给一个$ 2n 个 点 的 完 全 图 划 分 为 个点的完全图划分为 个点的完全图划分为 2n-1 $组不同的完美匹配了
我们考虑留下第$ 2n-1 号 点 ( 点 从 号点(点从 号点(点从 0 编 号 ) , 然 后 第 编号),然后第 编号),然后第 i 轮 我 们 把 编 号 轮我们把编号 轮我们把编号 j+k\equiv i(\mod(2n-1)) $ 的$ j 与 与 与 k 分 为 一 组 匹 配 , 最 后 会 剩 余 一 个 点 , 和 分为一组匹配,最后会剩余一个点,和 分为一组匹配,最后会剩余一个点,和 2n-1 $连,显然匹配是不重复的
考场上的想法:
考虑将矩形划分为$ n\times n $的单元
若构造一种每行同色,且n行颜色不同的单元矩阵。则它内部完全合法。而在它每一列的其它未填位上不能有重色。且这$ n\times n $的空位的每一行不能有重色。那么再在其上构造一个同色沿斜线分布的单元矩阵即可
类似的可以在“斜线矩阵”右边构造一个列同色矩阵。列同色矩阵下则需要构造一个每行每列为一个n排列,且有n个行列都不同的对应位颜色已确定的矩阵(暂时没有较方便的构法)。这样最多有$ n-1 列 行 同 色 矩 阵 + 斜 线 矩 阵 , 以 及 n 列 列 同 色 矩 阵 + 特 殊 矩 阵 。 这 里 m 也 可 以 取 到 列 行同色矩阵+斜线矩阵,以及n列 列同色矩阵+特殊矩阵。这里m也可以取到 列行同色矩阵+斜线矩阵,以及n列列同色矩阵+特殊矩阵。这里m也可以取到 2n-1 $
Review
要充分考虑题目条件的特殊性。发掘排列组合性质,不要陷入找规律。
这样的题,先证明上界,再构造到上界,是个不错的思路。
code
#include<cstdio>
using namespace std;
int n,m;
int b[205][10005];
int p[205],pos[105];
int main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
scanf("%d%d",&n,&m);
if (n==1)
{
if (m>1)
{
puts("-1");
return 0;
}
for (int i=1;i<=n*2;++i)
{
for (int j=1;j<=m;++j)
printf("1 ");
puts("");
}
return 0;
}
if (m>n*(2*n-1))
{
puts("-1");
return 0;
}
for (int i=1,x;i<=m;)
{
for (int j=0;j<2*n-1&&i<=m;++j)
{
for (int k=1;k<=2*n;++k)p[k]=0;
for (int k=0;k<2*n-1;++k)
if (!p[k+1])
{
if (p[(j-k+n*2-1)%(n*2-1)+1]||(j-k+n*2-1)%(n*2-1)==k)
{
p[k+1]=2*n;
p[n*2]=k+1;
}else
{
p[k+1]=(j-k+n*2-1)%(n*2-1)+1;
p[(j-k+n*2-1)%(n*2-1)+1]=k+1;
}
}
x=0;
for (int k=1;k<=2*n;++k)
if (k<p[k])pos[b[k][i]=b[p[k]][i]=++x]=k;
++i;
for (int k=1;k<n&&i<=m;++k,++i)
{
pos[0]=pos[1];
for (int l=1;l<n;++l)pos[l]=pos[l+1];
pos[n]=pos[0];
for (int l=1;l<=n;++l)
b[pos[l]][i]=b[p[pos[l]]][i]=l;
}
}
}
for (int i=1;i<=n*2;++i)
{
for (int j=1;j<=m;++j)
printf("%d ",b[i][j]);
puts("");
}
return 0;
}