[hdu7065]Yinyang
将一个格子看作一个节点,相邻(有公共边)的同色格子之间连边,那么由前两个条件即要求图恰被分为两个非空连通块(由于$n,m\ge 3$,显然不能不使用某种颜色)
下面,来分析图中的简单环,其对应于网格图上即会将网格图分为了两部分,简单分类讨论不难发现只有这个环恰有最外圈所有节点构成时仍能满足第3个条件
换言之,第3个条件即等价于图上至多存在一个所有最外圈节点所构成的环(由于$n,m\ge 3$,显然允许存在)
不妨先强制其不存在环,注意到$nm\le 100$,不妨假设$n\ge m$(否则交换),从上到下依次dp,并状压前$m$个点的颜色以及连通性,根据没有环即可转移
若仅保留可能得到的状态,最终状态数不超过$2\times 10^{4}$,即可以通过
关于最外圈所有节点所构成的环,特判最后两个节点的状态即可
(实现上可能有一些细节,可以参考代码)


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define mod 998244353
5 #define ll long long
6 #define fi first
7 #define se second
8 vector<pair<ll,int> >vv,v[2];
9 int t,n,m,ans,a[N][N],c[N],bl[N];
10 ll get_hash(){
11 ll s=0;
12 for(int i=0;i<m;i++)s=((s<<1)|c[i]);
13 for(int i=0;i<m;i++)s=((s<<4)|bl[i]);
14 return s;
15 }
16 void get_val(ll s){
17 for(int i=m-1;i>=0;i--,s>>=4)bl[i]=(s&15);
18 for(int i=m-1;i>=0;i--,s>>=1)c[i]=(s&1);
19 }
20 bool check(){
21 int x=-1,y=-1;
22 for(int i=0;i<m;i++){
23 if (!c[i]){
24 if (x<0)x=bl[i];
25 if (x!=bl[i])return 0;
26 }
27 else{
28 if (y<0)y=bl[i];
29 if (y!=bl[i])return 0;
30 }
31 }
32 return 1;
33 }
34 void merge(int x,int y){
35 if (x>y)swap(x,y);
36 for(int i=0;i<m;i++)
37 if (bl[i]==y)bl[i]=x;
38 }
39 void dfs(int k){
40 if (k==m){
41 v[0].push_back(make_pair(get_hash(),1));
42 return;
43 }
44 if (a[0][k]!=1){
45 c[k]=0,bl[k]=k;
46 if ((k)&&(!c[k-1]))bl[k]=bl[k-1];
47 dfs(k+1);
48 }
49 if (a[0][k]!=0){
50 c[k]=1,bl[k]=k;
51 if ((k)&&(c[k-1]))bl[k]=bl[k-1];
52 dfs(k+1);
53 }
54 }
55 int calc(ll s,int pos,int p){
56 get_val(s);
57 if (c[pos]==p){
58 if (!pos)return 1;
59 if (bl[pos-1]==bl[pos])return 0;
60 if (c[pos-1]==c[pos])merge(bl[pos-1],bl[pos]);
61 return 1;
62 }
63 bool flag=0;
64 for(int i=0;i<m;i++)
65 if ((i!=pos)&&(bl[i]==bl[pos]))flag=1;
66 if (!flag)return 0;
67 c[pos]=p;
68 if (bl[pos]!=pos)bl[pos]=pos;
69 else{
70 for(int i=0;i<m;i++)
71 if ((i!=pos)&&(bl[i]==pos)){
72 for(int j=0;j<m;j++)
73 if ((j!=pos)&&(bl[j]==pos))bl[j]=i;
74 break;
75 }
76 }
77 if ((pos)&&(c[pos-1]==c[pos]))bl[pos]=bl[pos-1];
78 return 1;
79 }
80 int main(){
81 scanf("%d",&t);
82 while (t--){
83 scanf("%d%d",&n,&m);
84 if (n>=m){
85 for(int i=0;i<n;i++)
86 for(int j=0;j<m;j++)scanf("%d",&a[i][j]);
87 }
88 else{
89 for(int i=0;i<n;i++)
90 for(int j=0;j<m;j++)scanf("%d",&a[j][i]);
91 swap(n,m);
92 }
93 int p=ans=0;
94 v[0].clear();
95 dfs(0);
96 for(int i=1;i<n;i++)
97 for(int j=0;j<m;j++){
98 if ((i==n-1)&&(j>=m-2))continue;
99 vv.clear();
100 for(int k=0;k<v[p].size();k++){
101 ll s=v[p][k].fi;
102 if ((a[i][j]!=1)&&(calc(s,j,0)))vv.push_back(make_pair(get_hash(),v[p][k].se));
103 if ((a[i][j]!=0)&&(calc(s,j,1)))vv.push_back(make_pair(get_hash(),v[p][k].se));
104 }
105 sort(vv.begin(),vv.end());
106 p^=1;
107 v[p].clear();
108 for(int k=0;k<vv.size();k++){
109 if ((!k)||(vv[k].fi!=vv[k-1].fi))v[p].push_back(make_pair(vv[k].fi,0));
110 v[p].back().se=(v[p].back().se+vv[k].se)%mod;
111 }
112 }
113 int a1=a[n-1][m-2],a2=a[n-1][m-1];
114 for(int i=0;i<v[p].size();i++){
115 ll s=v[p][i].fi;
116 get_val(s);
117 if (c[m-2]==c[m-1]){
118 if ((c[m-3]==c[m-2])||(!check()))continue;
119 if (a1!=c[m-2]){
120 ans=(ans+v[p][i].se)%mod;
121 if (a2<0)ans=(ans+v[p][i].se)%mod;
122 }
123 continue;
124 }
125 if (c[m-3]==c[m-2]){
126 if (bl[m-3]==bl[m-2]){
127 if ((a1!=c[m-2])&&(a2!=c[m-2])){
128 merge(bl[m-1],bl[m-3]);
129 if (check())ans=(ans+v[p][i].se)%mod;
130 }
131 }
132 else{
133 if (a1!=c[m-1]){
134 merge(bl[m-2],bl[m-3]);
135 if (check()){
136 ans=(ans+v[p][i].se)%mod;
137 if (a2<0)ans=(ans+v[p][i].se)%mod;
138 }
139 }
140 }
141 }
142 else{
143 if (bl[m-3]!=bl[m-1]){
144 if ((a1!=c[m-2])&&(a2!=c[m-2])){
145 merge(bl[m-1],bl[m-3]);
146 if ((check()))ans=(ans+v[p][i].se)%mod;
147 }
148 }
149 else{
150 if (!check())continue;
151 int ss=v[p][i].se;
152 if (a1<0)ss=(ss<<1)%mod;
153 if (a2<0)ss=(ss<<1)%mod;
154 ans=(ans+ss)%mod;
155 if ((a1!=c[m-2])&&(a2!=c[m-1]))ans=(ans-v[p][i].se+mod)%mod;
156 }
157 }
158 }
159 printf("%d\n",ans);
160 }
161 return 0;
162 }
[hdu7065]Yinyang的更多相关文章
- css border-radius & yin-yang & taiji
css border-radius & yin-yang & taiji solution css border-radius & tabs effect https://co ...
- [Scheme]Understanding the Yin-Yang Puzzle
这题目确实比较杀脑细胞... 原题: (let* ((yin ((lambda (cc) (display "@") cc) (call-with-current-continua ...
- 【usaco 2013 open yinyang】阴阳
题目 Farmer John 正在在计划自己的农场漫步.他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接.这样,他便可以通过这些谷仓间的道路 ...
- CSS代码实例:用CSS代码写出的各种形状图形
一共收集整理了图形20个,比较实用,同时也为了熟悉CSS的代码.整合了一下,有错误欢迎指出. 1.正方形 #square { width: 100px; height: 100px; backgrou ...
- CSS3实现阴阳鱼
直接上代码: <!doctype html> <html> <head> <meta charset="utf-8" /> < ...
- 摘记 史上最强大的40多个纯CSS绘制的图形(一)
今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...
- :before和 :after
:before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example:before { conte ...
- 史上最强大的40多个纯CSS绘制的图形
Square(正方形) #square { width: 100px; height: 100px; background: red; } Rectangle(矩形) #rectangle { wid ...
- 40多个纯CSS绘制的图形
本文由码农网 – 陈少华原创,转载请看清文末的转载要求. 今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和 ...
随机推荐
- Serverless 工程实践 | Serverless 应用优化与调试秘诀
作者|刘宇 前言:本文将以阿里云函数计算为例,提供了在线调试.本地调试等多种应用优化与调试方案. Serverless 应用调试秘诀 在应用开发过程中,或者应用开发完成,所执行结果不符合预期时,我 ...
- Postman快速入门
Postman是一款非常流行的支持HTTP/HTTPS协议的接口调试与测试工具,其功能非常强大,易用. 1 基础知识 1.1 下载与安装 Postman的安装步骤,本例以Windows ...
- vue3 element-plus 配置json快速生成table列表组件,提升生产力近500%(已在公司使用,持续优化中)
️本文为博客园首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gith ...
- 北鲲云超算如何让仿真技术、HPC和人工智能之间的深度融合?
在CAE领域,随着仿真技术在多个行业的深度应用,也带来了仿真模型日益复杂.仿真过程数据倍增.仿真计算费用昂贵等问题,降阶模型.人工智能.云计算等多种技术和仿真技术的深度融合,成为了仿真技术的重要发展趋 ...
- 秒级接入、效果满分的文档预览方案——COS文档预览
一.导语 说起 Microsoft Office 办公三件套,想必大家都不会陌生,社畜日常的工作或者生活中,多多少少遇到过这种情况: 本地创建的文档换一台电脑打开,就出现了字体丢失.排版混乱的情况 ...
- 更好的 java 重试框架 sisyphus 入门简介
What is Sisyphus sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 为什么选择这个名字 我觉得重试做的事情和西西弗斯很 ...
- 这样学BAT必面之软件设计原则,还不会就是我的问题
学习设计原则是学习设计模式的基础.在实际开发过程中,并不要求所有代码都遵循设计原则,我们要考虑人力.时间.成本.质量,不能刻意追求完美,但要在适当的场景遵循设计原则,这体现的是一种平衡取舍,可以帮助我 ...
- Google Object detection配置与使用
Google Object detection 前言: 本文记录了使用Google发布的Object detection(July 1st, 2019)接口,完成了对标注目标的检测.参考了很多博文,在 ...
- 记一次 .NET 某资讯论坛 CPU爆高分析
大概有11天没发文了,真的不是因为懒,本想前几天抽空写,不知道为啥最近求助的朋友比较多,一天都能拿到2-3个求助dump,晚上回来就是一顿分析,有点意思的是大多朋友自己都分析了几遍或者公司多年的牛皮藓 ...
- 权限管理RBAC模型概述
一.什么是RBAC模型 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George ...