[AGC030C] Coloring Torus
\(\text{Problem}:\)Coloring Torus
\(\text{Solution}:\)
首先考虑当 \(K\leq 500\) 时如何构造。一种显然的构造方式是第 \(i\) 行全为 \(i\)。但经尝试,这种构造方式难以推广到 \(K>n\)。
注意该矩阵满足的性质。不难发现,当 \(a_{i,j}=a_{i+1,j+1}\) 时,只需满足集合 \(\{a_{i-1,j},a_{i,j-1}\}\) 与 \(\{a_{i+2,j+1},a_{i+1,j+2}\}\) 相等。而 \(a_{i,j},a_{i+1,j+1}\) 位于同一条对角线上。如果令 \(a_{i-1,j}=a_{i+1,j+2}\) 且 \(a_{i,j-1}=a_{i+2,j+1}\),我们可以猜想:是否存在一种构造方式,使得每一条对角线上的 \(a\) 的都相等呢?
答案是肯定的。若对角线可以无限延长,那么只需对每一条对角线赋不同的值即可。但是在矩阵的 \(2n-1\) 条有限长的对角线上,可以发现,对前 \(n\) 条对角线(此处对角线按照从左上往右下的顺序标号,下同)赋 \(n\) 种不同的值,而第 \(i+n\) 条对角线上的权值应与第 \(i\) 条对角线上的权值相同。这样就解决了 \(K\leq n\) 的问题。
当 \(K>n\) 时,考虑重新回归到一开始找出的矩阵性质。当 \(a_{i-1,j}\) 与 \(a_{i+1,j+2}\) 被同时替换为 \(x\) 时,仍然满足题意。这提示我们可以在对角线上将行标号为奇数的位置同时改变为另一个数。而权值不同的对角线有 \(n\) 条,故当 \(K\leq 2n\) 时都可以构造。注意当 \(n\) 为奇数时是无法按照以上方法构造的(原因显然),但 \(n_{max}=500\) 为偶数,故无需考虑。
\(\text{Code}:\)
#include <bits/stdc++.h>
//#pragma GCC optimize(3)
//#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
#define vi vector<int>
#define vpi vector<pair<int,int>>
using namespace std; const int N=1010;
inline int read()
{
int s=0, w=1; ri char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
return s*w;
}
int K,n,a[N][N];
signed main()
{
K=read();
n=min(K,500);
printf("%d\n",n);
for(ri int i=1;i<=n;i++)
{
for(ri int j=1;j<=n;j++)
{
a[i][j]=(i+j-2)%n+1;
}
}
K-=n;
for(ri int T=1;T<=K;T++)
{
int cnt=0;
for(ri int i=1;i<=T;i++)
{
cnt++;
if(cnt&1) a[i][T-i+1]=T+n;
}
for(ri int i=1;i<=n-T;i++)
{
cnt++;
if(cnt&1) a[i+T][n-i+1]=T+n;
}
}
for(ri int i=1;i<=n;i++,puts(""))
for(ri int j=1;j<=n;j++)
printf("%d ",a[i][j]);
return 0;
}
原文地址:https://www.cnblogs.com/zkdxl/p/15116106.html
- 海量数据迁移之分区并行抽取(r2笔记53天)
- 海量数据迁移之外部表切分(r2笔记52天)
- 怎样突破表名30个字符的限制(r2笔记51天)
- C/C++——排序
- 关于move tablespace的问题总结(r2笔记50天)
- 一些极度危险的linux命令(r2笔记49天)
- 挑战数据结构与算法面试题——80题全解析(一)
- 关于操作失误的数据修复(r2笔记48天)
- 挑战数据结构与算法面试题——80题全解析(三)
- 巧用rowid简化sql查询(r2笔记47天)
- 算法类面试题解析——美团2016校招:棋子翻转
- 算法类面试题解析——美团2016校招:最大差值
- 用Python进行机器学习小案例
- 启用ODM极速调优IO (r2笔记66天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法