当前位置: 首页 > news >正文

题解:CF1495C Garden of the Sun

首先我们注意到我们不需要保证操作数的最小化,所以我们可以将能移走的向日葵全部移走。我们可以先把奇数排全部移走。但是偶数排有可能会有两个及以上的空地,所以我们考虑用并查集来维护,对于奇数排我们要移走的格子,它的上面一个格子和左右的格子必须不在同一个连通块内。然后考虑把没有相连的连通块通过偶数排的格子连起来。

我们奇数排要讨论两次,第一次只将四周至少有一个格子是空格的格子移走。第二次再把奇数排全部连通,不然会出现不连通的错解。

然后模拟即可。

接下来是代码环节:

#include<bits/stdc++.h>
using namespace std;
struct Node {int x, y;
} f[705][705];
int t, n, m;
bool mp[705][705];
string s;
Node get_father(int x, int y) {if (f[x][y].x == x && f[x][y].y == y) {return f[x][y];} else {f[x][y] = get_father(f[x][y].x, f[x][y].y);return f[x][y];}
}
bool check(Node x, Node y) {return (x.x == y.x && x.y == y.y);
}
signed main() {ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> t;while (t --) {cin >> n >> m;for (int i = 1; i <= n; i ++) {cin >> s;s = " " + s;for (int j = 1; j <= m; j ++) {if (s[j] == 'X') {mp[i][j] = true;}}}for (int i = 0; i <= n + 5; i ++) {for (int j = 0; j <= m + 5; j ++) {f[i][j].x = i, f[i][j].y = j;}}for (int i = 1; i <= n; i ++) {for (int j = 1; j <= m; j ++) {if (mp[i][j]) {if (mp[i - 1][j]) {Node fx = get_father(i - 1, j), fy = get_father(i, j);if (!check(fx, fy)) {f[fx.x][fx.y] = fy;}}if (mp[i][j - 1]) {Node fx = get_father(i, j - 1), fy = get_father(i, j);if (!check(fx, fy)) {f[fx.x][fx.y] = fy;}}if (mp[i + 1][j]) {Node fx = get_father(i + 1, j), fy = get_father(i, j);if (!check(fx, fy)) {f[fx.x][fx.y] = fy;}}if (mp[i][j + 1]) {Node fx = get_father(i, j + 1), fy = get_father(i, j);if (!check(fx, fy)) {f[fx.x][fx.y] = fy;}}}}}for (int i = 1; i <= n; i += 2) {for (int j = 1; j <= m; j ++) {if (!mp[i][j]) {Node fnow = get_father(i, j);Node fu = get_father(i + 1, j), fd = get_father(i - 1, j), fl = get_father(i, j - 1), fr = get_father(i, j + 1);if (mp[i + 1][j] && mp[i - 1][j] && mp[i][j + 1] && mp[i][j - 1]) {if (!check(fu, fd) && !check(fu, fl) && !check(fu, fr) && !check(fd, fl) && !check(fd, fr) && !check(fl, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1] && mp[i - 1][j]) {if (!check(fu, fd) && !check(fu, fr) && !check(fd, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1] && mp[i][j - 1]) {if (!check(fu, fl) && !check(fu, fr) && !check(fl, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i - 1][j] && mp[i][j - 1]) {if (!check(fu, fd) && !check(fu, fl) && !check(fd, fl)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i][j + 1] && mp[i - 1][j] && mp[i][j - 1]) {if (!check(fd, fl) && !check(fd, fr) && !check(fl, fr)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1]) {if (!check(fu, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j - 1]) {if (!check(fu, fl)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i - 1][j] && mp[i][j - 1]) {if (!check(fd, fl)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i - 1][j] && mp[i][j + 1]) {if (!check(fd, fr)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i - 1][j]) {if (!check(fu, fd)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;}} else if (mp[i][j + 1] && mp[i][j - 1]) {if (!check(fl, fr)) {mp[i][j] = true;f[fl.x][fl.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j]) {mp[i][j] = true;f[fu.x][fu.y] = fnow;} else if (mp[i - 1][j]) {mp[i][j] = true;f[fd.x][fd.y] = fnow;}else if (mp[i][j + 1]) {mp[i][j] = true;f[fr.x][fr.y] = fnow;}}}}for (int i = 1; i <= n; i += 2) {for (int j = 1; j <= m; j ++) {if (!mp[i][j]) {Node fnow = get_father(i, j);Node fu = get_father(i + 1, j), fd = get_father(i - 1, j), fl = get_father(i, j - 1), fr = get_father(i, j + 1);if (mp[i + 1][j] && mp[i - 1][j] && mp[i][j + 1] && mp[i][j - 1]) {if (!check(fu, fd) && !check(fu, fl) && !check(fu, fr) && !check(fd, fl) && !check(fd, fr) && !check(fl, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1] && mp[i - 1][j]) {if (!check(fu, fd) && !check(fu, fr) && !check(fd, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1] && mp[i][j - 1]) {if (!check(fu, fl) && !check(fu, fr) && !check(fl, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i - 1][j] && mp[i][j - 1]) {if (!check(fu, fd) && !check(fu, fl) && !check(fd, fl)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i][j + 1] && mp[i - 1][j] && mp[i][j - 1]) {if (!check(fd, fl) && !check(fd, fr) && !check(fl, fr)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1]) {if (!check(fu, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j - 1]) {if (!check(fu, fl)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i - 1][j] && mp[i][j - 1]) {if (!check(fd, fl)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i - 1][j] && mp[i][j + 1]) {if (!check(fd, fr)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i - 1][j]) {if (!check(fu, fd)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;}} else if (mp[i][j + 1] && mp[i][j - 1]) {if (!check(fl, fr)) {mp[i][j] = true;f[fl.x][fl.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i][j - 1]) {mp[i][j] = true;f[fl.x][fl.y] = fnow;} else if (mp[i + 1][j]) {mp[i][j] = true;f[fu.x][fu.y] = fnow;} else if (mp[i - 1][j]) {mp[i][j] = true;f[fd.x][fd.y] = fnow;} else if (mp[i][j + 1]) {mp[i][j] = true;f[fr.x][fr.y] = fnow;} else {mp[i][j] = true;}}}}for (int i = 2; i <= n; i += 2) {for (int j = 1; j <= m; j ++) {if (!mp[i][j]) {Node fnow = get_father(i, j);Node fu = get_father(i + 1, j), fd = get_father(i - 1, j), fl = get_father(i, j - 1), fr = get_father(i, j + 1);if (mp[i + 1][j] && mp[i - 1][j] && mp[i][j + 1] && mp[i][j - 1]) {if (!check(fu, fd) && !check(fu, fl) && !check(fu, fr) && !check(fd, fl) && !check(fd, fr) && !check(fl, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1] && mp[i - 1][j]) {if (!check(fu, fd) && !check(fu, fr) && !check(fd, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1] && mp[i][j - 1]) {if (!check(fu, fl) && !check(fu, fr) && !check(fl, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i - 1][j] && mp[i][j - 1]) {if (!check(fu, fd) && !check(fu, fl) && !check(fd, fl)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i][j + 1] && mp[i - 1][j] && mp[i][j - 1]) {if (!check(fd, fl) && !check(fd, fr) && !check(fl, fr)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j + 1]) {if (!check(fu, fr)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i][j - 1]) {if (!check(fu, fl)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i - 1][j] && mp[i][j - 1]) {if (!check(fd, fl)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fl.x][fl.y] = fnow;}} else if (mp[i - 1][j] && mp[i][j + 1]) {if (!check(fd, fr)) {mp[i][j] = true;f[fd.x][fd.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i + 1][j] && mp[i - 1][j]) {if (!check(fu, fd)) {mp[i][j] = true;f[fu.x][fu.y] = fnow;f[fd.x][fd.y] = fnow;}} else if (mp[i][j + 1] && mp[i][j - 1]) {if (!check(fl, fr)) {mp[i][j] = true;f[fl.x][fl.y] = fnow;f[fr.x][fr.y] = fnow;}} else if (mp[i][j - 1]) {mp[i][j] = true;f[fl.x][fl.y] = fnow;} else if (mp[i + 1][j]) {mp[i][j] = true;f[fu.x][fu.y] = fnow;} else if (mp[i - 1][j]) {mp[i][j] = true;f[fd.x][fd.y] = fnow;} else if (mp[i][j + 1]) {mp[i][j] = true;f[fr.x][fr.y] = fnow;}}}}for (int i = 1; i <= n; i ++) {for (int j = 1; j <= m; j ++) {if (mp[i][j]) {cout << "X";} else {cout << ".";}}cout << "\n";}cout << "\n";for (int i = 0; i <= n + 5; i ++) {for (int j = 0; j <= m + 5; j ++) {mp[i][j] = false;}}}return 0;
}
http://www.jsqmd.com/news/744250/

相关文章:

  • 如何用Python实现百度网盘高速下载:终极解析工具完整指南
  • 【Python故障预测实战指南】:20年专家亲授3大工业级模型+5个避坑红线
  • DS4Windows终极指南:3步让你的PlayStation手柄在Windows上完美游戏
  • YOLOv11 改进 - 主干网络 清华大学CloFormer AttnConv :利用共享权重和上下文感知权重增强局部感知,注意力机制与卷积的完美融合
  • 终极指南:让你的Windows风扇控制软件完美支持中文界面
  • 数据同步 黑马 Elasticsearch 全套教程,黑马旅游网案例
  • 题解:CF1593G Changing Brackets
  • 题解:P11605 [PA 2016] 运算 / Jedynki
  • Gemini CLI Ralph扩展:AI驱动的自迭代开发循环实战指南
  • 从算盘到CPU:补码的诞生如何解决了计算机的‘减法难题’?一段被忽略的技术演进史
  • 六西格玛在国企有用吗? - 众智商学院官方
  • 从零到一:手把手教你用Qt Creator和C++为无人机地面站开发实时姿态显示界面
  • 三步掌握Umi-OCR:离线文字识别的终极解决方案
  • 被动展开球形机器人轨迹跟踪【附代码】
  • RemoteCC:基于WebSocket的本地网络远程终端控制方案
  • 题解:B3731 [信息与未来 2017] 房屋积水
  • Python多源数据融合卡顿?揭秘92%工程师忽略的3层内存泄漏陷阱及秒级修复方案
  • 题解:P11511 [ROIR 2017 Day 2] 大型直线对撞机
  • HS2-HF Patch:让Honey Select 2游戏体验焕然一新的神奇补丁
  • 当 AI 学会“三思后言”:安全护栏如何从源头掐灭偏见、幻觉与恶意攻击?
  • PrimerBank挖宝指南:如何快速找到小鼠/人基因已验证的qPCR引物(附结果解读)
  • 模型瘦身实战:利用TensorFlow Lite的量化与剪枝,将模型体积压缩80%
  • Python读取GE MRI序列报错“No valid SOP Class UID”?独家逆向解析厂商私有Tag映射表(仅限本期公开)
  • 南京黄金上门回收天花板!2026 无脑选 福正美黄金回收 - 福正美黄金回收
  • 基于Blob存储与React构建零运维加密货币仪表盘实战
  • 别再只看金叉死叉了!用通达信这个自定义指标,教你捕捉MACD背离的“黄金坑”与“风险区”
  • 5G手机里的紧急警报是怎么来的?手把手带你读懂SIB8系统消息
  • 2026 苏州黄金回收避坑指南:选福正美,不扣点不熔金 - 福正美黄金回收
  • 如何永久保存微信聊天记录:WeChatMsg本地免费工具完整指南
  • WeiboImageReverse:如何快速追溯微博图片原作者?终极免费解决方案指南