DTOJ#5188. 彩

传送门
你有一个 2 n × m 2n\times m 2n×m 的网格,你需要给每个格子染上 n n n 种颜色之一,且对于每一个由格子组成的且边界平行于网格边界且边长大于等于 2 2 2 的矩形,它的四个角的格子的颜色不完全相同。
一行两个数 n n n m m m 表示矩形的大小。

输出一个符合条件的 2 n × m 2n\times m 2n×m 的矩形,或者一个数 − 1 -1 1 表示无解。如果有多组解,输出任意一种即可。

样例输入
3 3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Subtask 1( 10 10 10 分): n ≤ 2 , m ≤ 3 n\leq 2,m\leq 3 n2,m3

Subtask 2( 20 20 20 分): n ≤ 5 , m ≤ 5 n\leq 5,m\leq 5 n5,m5

Subtask 3( 30 30 30 分): n ≤ 50 , m ≤ 100 n\leq 50,m\leq 100 n50,m100

Subtask 4( 40 40 40 分): n ≤ 100 , m ≤ 10000 n\leq 100,m\leq 10000 n100,m10000

ahsdfz noip2020模拟

题解:

我们要求每列每种颜色必须出现两次
这样算出来的列数最多有 n × ( 2 n − 1 ) n\times (2n-1) n×(2n1)
然后我们这样染色:先找到 1 1 1 2 n 2n 2n的一组匹配,然后每组匹配点的颜色要求相同,我们先给第一组染一号色,第二组染二号……然后我们环移一次后再染,一共能产生 n n n 组合法的对列的染色方案
接下来就是给一个 2 n 2n 2n 个点的完全图划分为 2 n − 1 2n-1 2n1 组不同的完美匹配了
我们考虑留下第 2 n − 1 2n-1 2n1 号点(点从 0 0 0 编号),然后第 i i i 轮我们把编号 j + k = i ( m o d ( 2 n − 1 ) ) j+k=i(mod(2n-1)) j+k=i(mod(2n1)) j j j k k k 分为一组匹配,最后会剩余一个点,和 2 n − 1 2n-1 2n1 连,显然匹配是不重复的

#include<bits/stdc++.h>
#define N 105
#define M 100005
using namespace std;
int read(){
	int op=1,sum=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') op=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+ch-'0',ch=getchar();
	return op*sum;
}
int cl[N<<1];
int ans[N<<1][M];
int main(){
    int n=read(),m=read();
    if(m>n*(2*n-1)){puts("-1");return 0;}
	for(int i=0;i<m;++i){
		if(i%n==0){
			int ct=0,re=i/n;
			for(int j=0;j<2*n;++j)cl[j]=-1;
			for(int j=0;j<2*n-1;++j){
				if(cl[j]==-1){
					int to=(i+2*n-1-j)%(2*n-1);
					if(j==to)to=2*n-1;
					cl[j]=cl[to]=ct++;
					//if(i==2)cout<<j<<"->"<<to<<endl;
				}
			}
			/*for(int j=0;j<2*n;++j){
				cout<<cl[j]<<" ";
			}
			cout<<endl;*/
		}
		int re=i%n;
		for(int j=0;j<2*n;++j){
			ans[j][i]=(cl[j]+re)%n;
		}
	}
	for(int i=0;i<2*n;++i){
		for(int j=0;j<m;++j){
			printf("%d ",ans[i][j]+1);
		}
		puts("");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值