热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CF1567FOneFourOverload

CF1567FOne-FourOverload我居然把这道\(2700\)的题切了!!!\(-OHHHHHHHHHHHHHHHH!!!\)没有标记的格子只能选\(1\)或者\(4\

CF1567F One-Four Overload

我居然把这道 \(2700\) 的题切了!!!

\(-OHHHHHHHHHHHHHHHH!!!\)

没有标记的格子只能选 \(1\) 或者 \(4\) , 标记的格子必须是 \(5\) 的倍数.

比较显然的是, 标记的格子周围必须有且只能有偶数个 (包括 \(0\) ) 未标记的格子, 否则无解.

接下来我们考虑构造一组解.

比较显然的是, 如果一个标记的格子周围只有两个未标记的格子, 那么一定是一个 \(1\) 一个 \(4\) , 不管是 \(L\) 形还是 \(I\) 形.

如果有 \(4\) 个呢? 那么我们就把同一行的和同一列的填上相同的数. 为什么?

因为一对 \(I\) 形的未标记格子只可能对应一个标记的格子, 而一对 \(L\) 形的可能对应两个标记的格子, 所以我们只需要保证这 \(4\) 个未标记格子分别组成的两组 \(L\) 形合法就够了.

所以我们就判断一下, 如果这个标记的格子周围只有两个未标记的, 直接连边, 四个的话, 把四个 \(L\) 连起来, 注意, 是双向边.

\(code:\)

#include
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define calc(i, j) (i - 1) * m + j
int read() {
int x = 0, f = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = (x <<1) + (x <<3) + (ch ^ 48);
return x * f;
}
const int N = 505, M = 1e6 + 5;
int n, m;
int a[N][N], ans[N * N];
int tot, to[M], nxt[M], head[M];
char s[N][N];
void Add(int u, int v) {
to[++tot] = v, nxt[tot] = head[u], head[u] = tot;
to[++tot] = u, nxt[tot] = head[v], head[v] = tot;
}
bool Check(int i, int j, int k, int l) {
if (!a[i][j] && !a[k][l]) return true;
return false;
}
int Sum(int x, int y) {
int sum = 0;
if (!a[x - 1][y]) sum += ans[calc(x - 1, y)];
if (!a[x][y - 1]) sum += ans[calc(x, y - 1)];
if (!a[x][y + 1]) sum += ans[calc(x, y + 1)];
if (!a[x + 1][y]) sum += ans[calc(x + 1, y)];
return sum;
}
void DFS(int x, int fa) {
ans[x] = 5 - ans[fa];
for (int i = head[x]; i; i = nxt[i]) {
int y = to[i];
if (!ans[y]) DFS(y, x);
}
}
int main() {
n = read(), m = read(), ans[0] = 1;
for (int i = 1; i <= n; i++) {
scanf("%s", s[i] + 1);
for (int j = 1; j <= m; j++) a[i][j] = s[i][j] == 'X';
}
for (int i = 2; i for (int j = 2; j if (a[i][j]) { //判断无解
if (a[i - 1][j] + a[i][j - 1] + a[i][j + 1] + a[i + 1][j] & 1) {
printf("NO");
return 0;
}
if (Check(i - 1, j, i + 1, j) && !Check(i, j - 1, i, j + 1)) Add(calc(i - 1, j), calc(i + 1, j));
else if (!Check(i - 1, j, i + 1, j) && Check(i, j - 1, i, j + 1)) Add(calc(i, j - 1), calc(i, j + 1));
else {
if (Check(i - 1, j, i, j + 1)) Add(calc(i - 1, j), calc(i, j + 1));
if (Check(i, j + 1, i + 1, j)) Add(calc(i, j + 1), calc(i + 1, j));
if (Check(i + 1, j, i, j - 1)) Add(calc(i + 1, j), calc(i, j - 1));
if (Check(i, j - 1, i - 1, j)) Add(calc(i, j - 1), calc(i - 1, j));
}
}
}
}
for (int i = 1; i <= n; i++) { //染色
for (int j = 1; j <= m; j++) {
if (!ans[calc(i, j)] && !a[i][j]) DFS(calc(i, j), 0);
}
}
for (int i = 1; i <= n; i++) { //统计 marked cell 的答案
for (int j = 1; j <= m; j++) {
if (a[i][j]) {
ans[calc(i, j)] = Sum(i, j);
}
}
}
printf("YES\n");
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) printf("%d ", ans[calc(i, j)]);
printf("\n");
}
return 0;
}

看不见我看不见我看不见我



推荐阅读
  • 寡妇制造者瞬镜机制详解与应用技巧 ... [详细]
  • 在探讨 MySQL 正则表达式 REGEXP 的功能与应用之前,我们先通过一个小实验来对比 REGEXP 和 LIKE 的性能。通过具体的代码示例,我们将评估这两种查询方式的效率,以确定 REGEXP 是否值得深入研究。实验结果将为后续的详细解析提供基础。 ... [详细]
  • Navicat Premium 12 连接 Oracle 数据库时出现 ORA-03113 错误:通信通道上的文件结束。进程ID:3344,会话ID:244,序列号:56707
    在使用 Navicat Premium 12 连接 Oracle 数据库时,遇到了 ORA-03113 错误,提示“通信通道上的文件结束”。具体错误信息显示进程ID为3344,会话ID为244,序列号为56707。经初步分析,该错误可能是由于数据库曾被强制关闭,导致文件状态不一致所致。通过关闭并重新建立数据库连接,问题得以顺利解决。此解决方案适用于类似情况,建议在遇到此类错误时,首先检查数据库的运行状态和日志记录,以确保数据的一致性和完整性。 ... [详细]
  • 《新雷》译文与原文赏析:清代诗人张维屏的诗意解析 ... [详细]
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 《岳阳怀古》译文与原文赏析:唐代诗人吕温的文学艺术探索 ... [详细]
  • 利用 Zend Framework 实现高效邮件发送功能 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 安装Windows 10必须使用U盘吗?如果不使用U盘,还有哪些方法可以安装Windows 10?
    安装Windows 10必须使用U盘吗?如果不使用U盘,还有哪些方法可以安装Windows 10? ... [详细]
  • 在众多市场调研公司中,如何选择一家值得信赖的合作伙伴至关重要。基于我在市场调查行业近二十年的经验,我将推荐几家国内知名的市场调研机构,供您参考:1. 开元研究——专注于零售报刊发行研究、媒体广告价值评估及网络营销分析等领域,以其专业性和准确性赢得了广泛认可。 ... [详细]
  • 近期,针对Axis2默认凭据漏洞的攻击案例在安全社区引起了广泛关注。这些攻击通常利用Axis2的默认用户名和密码进行渗透测试,技术手段相对固定。本文在综合分析多个案例的基础上,详细探讨了该漏洞的安全风险,并提出了有效的防范措施,以帮助企业和开发者加强Web服务的安全防护。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
author-avatar
当王子爱上灰姑娘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有