传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个n∗mn*mn∗m的矩形,包含...和XXX,你有两种颜色,你需要给...染色使得每个XXX上下左右相邻的...其两种颜色个数相同,输出一种合法方案。

1≤n,m≤5001\le n,m\le 5001≤n,m≤500

思路:

考虑XXX周围...的个数的情况。

(1)(1)(1) 当有奇数个...的时候,显然不可能有合法解。

(2)(2)(2)当有两个...的时候,我们将其连边,变成一个图,显然可以直接二分图染色构造答案。

(3)(3)(3)当有四个...的时候,这个就比较麻烦了,一种可行方案就是(x−1,y)<=>(x,y−1)(x-1,y)<=>(x,y-1)(x−1,y)<=>(x,y−1)连边,(x+1,y)<=>(x,y+1)(x+1,y)<=>(x,y+1)(x+1,y)<=>(x,y+1)连边,让后跑二分图染色即可。

对于(3)(3)(3)的正确性官方题解有说,其实并没怎么看懂,但是自己画一下应该可以发现这样是可以的,因为要是出来奇数环的话需要奇数条边,而这种斜边必须是偶数个,那么横边必须是奇数个,貌似可以感性认知一下?雀氏不是很会证。

// Problem: F. One-Four Overload
// Contest: Codeforces - Codeforces Round #742 (Div. 2)
// URL: https://codeforces.com/contest/1567/problem/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=510,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
PII a[N];
char s[N][N];
int dir[4][2]={-1,0,0,-1,1,0,0,1};
vector<int>v[N*N*2];
int col[N*N],flag;int id(int x,int y) {return (x-1)*m+y;
}void dfs(int u,int color) {if(flag) return;col[u]=color;for(auto x:v[u]) {if(flag) break;if(!col[x]) dfs(x,3-color);else if(col[x]==color) flag=1;}
}bool check() {for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {if(s[i][j]!='X') continue;int cnt=0;for(int k=0;k<4;k++) {int dx=i+dir[k][0];int dy=j+dir[k][1];if(dx<1||dy<1||dx>n||dy>m) continue;cnt+=s[dx][dy]=='.';if(s[dx][dy]=='.') a[cnt]={dx,dy};}if(cnt%2) return false;if(cnt==2) {v[id(a[1].X,a[1].Y)].pb(id(a[2].X,a[2].Y));v[id(a[2].X,a[2].Y)].pb(id(a[1].X,a[1].Y));} else {v[id(a[1].X,a[1].Y)].pb(id(a[2].X,a[2].Y));v[id(a[2].X,a[2].Y)].pb(id(a[1].X,a[1].Y));v[id(a[3].X,a[3].Y)].pb(id(a[4].X,a[4].Y));v[id(a[4].X,a[4].Y)].pb(id(a[3].X,a[3].Y));}}}flag=0;for(int i=1;i<=n*m;i++) col[i]=0;for(int i=1;i<=n*m;i++) if(s[(i-1)/m+1][(i-1)%m+1]!='X'&&!col[i]&&!flag) dfs(i,1); if(flag) return false;puts("YES");for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {int val=id(i,j);if(s[i][j]=='X') {int cnt=0;for(int k=0;k<4;k++) {int dx=i+dir[k][0];int dy=j+dir[k][1];if(dx<1||dy<1||dx>n||dy>m) continue;cnt+=s[dx][dy]=='.';if(s[dx][dy]=='.') a[cnt]={dx,dy};}if(cnt==0) printf("0 ");else if(cnt==2) printf("5 ");else printf("10 ");}else if(col[val]==1) printf("1 ");else printf("4 ");}puts("");}return true;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0); scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",s[i]+1);if(!check()) puts("NO");int x;return 0;
}
/**/

Codeforces Round #742 (Div. 2) F. One-Four Overload 构造 + 二分图染色相关推荐

  1. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  2. Codeforces Round #644 (Div. 3) F.Spy-string

    Codeforces Round #644 (Div. 3) F.Spy-string 题目链接 You are given n strings a1,a2,-,an: all of them hav ...

  3. Codeforces Round #849 (Div. 4) F. Range Update Point Query

    Codeforces Round #849 (Div. 4) F. Range Update Point Query 题目大意: 给一串数字,有两个操作: 操作1:将 l − r l-r l−r 的数 ...

  4. Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,你需要实现两种操作: (1)(1)(1) 将[l,r][l,r][l,r]的aia_iai​都乘rrr. (2)(2)(2) 求ϕ(∏i= ...

  5. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  6. Codeforces Round #585 (Div. 2) F. Radio Stations 2-sat + 神仙建模

    传送门 文章目录 题意: 思路: 题意: 你现在有ppp种电台,有nnn对关系(x,y)(x,y)(x,y)代表xxx电台或yyy电台中至少有一个,mmm对关系(x,y)(x,y)(x,y)代表xxx ...

  7. Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e9+71e9+71e9+7取模. n ...

  8. Codeforces Round #592 (Div. 2) F. Chips 构造 + 细节

    传送门 文章目录 题意: 思路: 题意: 思路: 恶心的构造题,思路很简单但是代码细节很多,搞了半天. 根据题目的性质不难发现,如果有两个相同颜色的球相邻,那么他们的颜色永远不会改变. 根据这个性质, ...

  9. Codeforces Round #588 (Div. 2) F. Konrad and Company Evaluation 图论 + 建反图 好题

    传送门 文章目录 题意: 思路: 题意: 给你一张nnn个点mmm条边的图,其中每个点iii初始编号为iii,边是有向的,方向为从编号大的指向编号小的.定义一个贡献为存在某三个点a,b,ca,b,ca ...

最新文章

  1. Microsoft加入量子计算的竞争
  2. java bmp信息隐藏_BMP图像信息隐藏及检测
  3. SpringBoot配置在应用启动后立即执行某些方法代码案例
  4. [html] 可替换元素和不可替换元素有什么不同的特点?
  5. 用python画面积图_Python笔记:用matplotlib绘制面积图
  6. Linux笔记(shell特殊符号,sort排序,wc统计,uniq去重,tee,tr,split)
  7. 编码——纠正网上的大量错误
  8. 计算机软件配置项csci
  9. html放大镜小图标,canvas初尝试之放大镜图标绘制
  10. Linux域名IP映射
  11. 除了装去广告软件,你还能通过「禁止APP联网」来屏蔽广告
  12. php 云片网对接,如何实现php调用云片网接口发送短信
  13. 手机浏览器/H5页面实现打开微信代码 引导关注公众号
  14. 拉着老公,逛了一趟绿源电动车连锁店,喜提新座驾。
  15. 手机云便签怎么设置休息日免打扰?
  16. Office 365 小技巧 :Microsoft Teams_ 就地编辑文档
  17. 计算机丢失文件无法打开ae,ae工程文件打开提示素材丢失该怎么办?
  18. 美国第一个设置计算机学科的学校,美国普渡大学希拉法叶校区
  19. 未来财富:呼啸而来的数字人民币
  20. 50个经典的增长黑客策略

热门文章

  1. java数位倒置递归_有人能解释一下这个递归代码如何在java中反转int吗?
  2. java jdk实现快速排序_Java实现快速排序过程分析
  3. go获取项目内所有proto_gRPC学习之三:初试GO版gRPC开发
  4. 豆瓣评分9.4!这一部纪录片,探秘中国的未至之境!
  5. 三年磨一剑,五次被拒稿,交大博士坚持稿件申诉,终发表学科顶刊
  6. 50张图,带你认识大学各专业
  7. 像小猪佩奇那样生活,需要多少钱?
  8. 计算机PS英语词汇,操作计算机必读(必会)的53个英文单词共享
  9. 下面选项能正确表示JAVA_模拟试题2
  10. config.php开启redis,微擎如何开启redis,redis开启方法详解