表示今天一发A了这题拿了rk3...是个sb构造...

考虑除了\(n=1/m=1\)的情况,最小次数\(ans\)不会\(>3\)。

对于\(n=1/m=1\),暴力即可。

然后考虑\(ans=0\),只有在图中没有\(1\)时成立。

对于\(ans=1\),图中的\(1\)是一个四联通块

对于\(ans=2\),加入图中的某个\(0\)的四联通块后所有的\(1\)是一个四联通块。

对于其他的情况,若\(\max(n,m)<3\),显然只有\(n=m=2\),枚举\(16\)种情况发现\(ans\leq 2\)。

所以考虑有\(\max(n,m)\geq 3\),此时一定可以构造出\(ans=3\)的合法方案。构造方式如下:

  • 不妨设\(n\leq m\),则\(m\geq3\)。
  • 两个矩阵为+,一个矩阵为-
  • 将第一个矩阵的第一列和奇数行的第二列到第\(m-1\)列设为\(1\)。
  • 将第二个矩阵的第\(m\)列和偶数行的第二列到第\(m-1\)列设为\(1\)。
  • 将两个矩阵第二列到第\(m-1\)列在目标矩阵中的对应位置为\(1\)的位置设为\(1\)(此时一定满足四联通性质)。
  • 将第三个矩阵的第二列到第\(m-1\)列设为\(1\),第一列和第\(m\)列在目标矩阵中的对应位置为\(0\)的位置设为\(1\)。

此时一定可以构造出合法的方案,\(ans=3\)。

槽点:这题\(n,m\leq500\)挺垃圾的,为什么不开\(n,m\leq5000\)(虽说得稍微改一下实现)。

放代码:代码里面有些重复的东西是复制出来的所以看起来可能会有点丑...

#include<bits/stdc++.h>using namespace std;const int N=502,fx[2][4]={{0,0,1,-1},{1,-1,0,0}};int n,m;char s[N][N],t[N][N],r[N][N],q[N][N];int vis[N][N],cnt[2];bool check0(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='1'){return 0;}}}return 1;
}void solve0(){printf("0\n");
}void dfs1(int u,int v){if(vis[u][v]){return;}vis[u][v]=1;for(int i=0,tx,ty;i<4;i++){tx=u+fx[0][i];ty=v+fx[1][i];if(tx<1||ty<1||tx>n||ty>m){continue;}if(s[tx][ty]=='1'&&!vis[tx][ty]){dfs1(tx,ty);}}
}bool check1(){memset(vis,0,sizeof vis);bool flag=1;for(int i=1;i<=n;i++){if(!flag){break;}for(int j=1;j<=m;j++){if(s[i][j]=='1'){dfs1(i,j);flag=0;break;}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='1'){if(!vis[i][j]){return 0;}}}}return 1;
}void solve1(){printf("1\n+\n");for(int i=1;i<=n;i++){printf("%s\n",s[i]+1);}
}set<int>st;void dfs2(int u,int v,int w){if(vis[u][v]){return;}vis[u][v]=w;for(int i=0,tx,ty;i<4;i++){tx=u+fx[0][i];ty=v+fx[1][i];if(tx<1||ty<1||tx>n||ty>m){continue;}if(s[tx][ty]=='0'&&!vis[tx][ty]){dfs2(tx,ty,w);}else if(s[tx][ty]=='1'){st.insert(vis[tx][ty]);}}
}void dfs21(int u,int v,int w){if(vis[u][v]){return;}vis[u][v]=w;for(int i=0,tx,ty;i<4;i++){tx=u+fx[0][i];ty=v+fx[1][i];if(tx<1||ty<1||tx>n||ty>m){continue;}if(s[tx][ty]=='1'&&!vis[tx][ty]){dfs21(tx,ty,w);}}
}bool check2(){memset(vis,0,sizeof vis);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='1'&&!vis[i][j]){dfs21(i,j,++cnt[1]);}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='0'&&!vis[i][j]){st.clear();dfs2(i,j,++cnt[0]);if((int)st.size()==cnt[1]){return 1;}}}}return 0;
}void solve2(){printf("2\n");for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){t[i][j]=s[i][j];q[i][j]='0';if(s[i][j]=='0'&&vis[i][j]==cnt[0]){t[i][j]='1';q[i][j]='1';}}}printf("+\n");for(int i=1;i<=n;i++){printf("%s\n",t[i]+1);}printf("-\n");for(int i=1;i<=n;i++){printf("%s\n",q[i]+1);}
}int lb[N],rb[N];void solven1(){memset(vis,0,sizeof vis);memset(cnt,0,sizeof cnt);memset(lb,0x3f,sizeof lb);for(int i=1;i<=m;i++){if(s[1][i]=='1'){if(vis[1][i]){continue;}dfs21(1,i,++cnt[1]);}}for(int i=1;i<=m;i++){if(vis[1][i]){lb[vis[1][i]]=min(lb[vis[1][i]],i);rb[vis[1][i]]=max(rb[vis[1][i]],i);}}int ans=cnt[1],lmt,ll=1,rr=cnt[1];printf("%d\n",ans);if(cnt[1]&1){lmt=ans>>1;for(int i=1;i<=lmt;i++){printf("+\n");for(int j=1;j<=m;j++){t[1][j]='0';}for(int j=lb[ll];j<=rb[rr];j++){t[1][j]='1';}printf("%s\n",t[1]+1);printf("-\n");for(int j=1;j<=m;j++){t[1][j]='0';}for(int j=rb[ll]+1;j<lb[rr];j++){t[1][j]='1';}printf("%s\n",t[1]+1);ll++;rr--;}for(int j=1;j<=m;j++){t[1][j]='0';}for(int j=lb[ll];j<=rb[ll];j++){t[1][j]='1';}printf("+\n");printf("%s\n",t[1]+1);}else{lmt=ans>>1;for(int i=1;i<=lmt;i++){printf("+\n");for(int j=1;j<=m;j++){t[1][j]='0';}for(int j=lb[ll];j<=rb[rr];j++){t[1][j]='1';}printf("%s\n",t[1]+1);printf("-\n");for(int j=1;j<=m;j++){t[1][j]='0';}for(int j=rb[ll]+1;j<lb[rr];j++){t[1][j]='1';}printf("%s\n",t[1]+1);ll++;rr--;}}
}void solvem1(){memset(vis,0,sizeof vis);memset(cnt,0,sizeof cnt);memset(lb,0x3f,sizeof lb);for(int i=1;i<=n;i++){if(s[i][1]=='1'){if(vis[i][1]){continue;}dfs21(i,1,++cnt[1]);}}for(int i=1;i<=n;i++){if(vis[i][1]){lb[vis[i][1]]=min(lb[vis[i][1]],i);rb[vis[i][1]]=max(rb[vis[i][1]],i);}}int ans=cnt[1],lmt,ll=1,rr=cnt[1];printf("%d\n",ans);if(cnt[1]&1){lmt=ans>>1;for(int i=1;i<=lmt;i++){printf("+\n");for(int j=1;j<=n;j++){t[j][1]='0';}for(int j=lb[ll];j<=rb[rr];j++){t[j][1]='1';}for(int j=1;j<=n;j++){printf("%s\n",t[j]+1);}printf("-\n");for(int j=1;j<=n;j++){t[j][1]='0';}for(int j=rb[ll]+1;j<lb[rr];j++){t[j][1]='1';}for(int j=1;j<=n;j++){printf("%s\n",t[j]+1);}ll++;rr--;}for(int j=1;j<=n;j++){t[j][1]='0';}for(int j=lb[ll];j<=rb[ll];j++){t[j][1]='1';}printf("+\n");for(int j=1;j<=n;j++){printf("%s\n",t[j]+1);}}else{lmt=ans>>1;for(int i=1;i<=lmt;i++){printf("+\n");for(int j=1;j<=n;j++){t[j][1]='0';}for(int j=lb[ll];j<=rb[rr];j++){t[j][1]='1';}for(int j=1;j<=n;j++){printf("%s\n",t[j]+1);}printf("-\n");for(int j=1;j<=n;j++){t[j][1]='0';}for(int j=rb[ll]+1;j<lb[rr];j++){t[j][1]='1';}for(int j=1;j<=n;j++){printf("%s\n",t[j]+1);}ll++;rr--;}}
}void ssolve(){printf("3\n");for(int i=1;i<=m;i++){t[1][i]='1';t[n][i]='0';r[1][i]='0';r[n][i]='1';for(int j=2;j<n;j++){t[j][i]=s[j][i];r[j][i]=s[j][i];}if(i&1){for(int j=1;j<n;j++){t[j][i]='1';}}else{for(int j=2;j<=n;j++){r[j][i]='1';}}}for(int i=1;i<=m;i++){q[1][i]=(s[1][i]!='1'?'1':'0');q[n][i]=(s[n][i]!='1'?'1':'0');for(int j=2;j<n;j++){q[j][i]='1';}}printf("+\n");for(int i=1;i<=n;i++){printf("%s\n",t[i]+1);}printf("+\n");for(int i=1;i<=n;i++){printf("%s\n",r[i]+1);}printf("-\n");for(int i=1;i<=n;i++){printf("%s\n",q[i]+1);}
}void solve(){printf("3\n");for(int i=1;i<=n;i++){t[i][1]='1';t[i][m]='0';r[i][1]='0';r[i][m]='1';for(int j=2;j<m;j++){t[i][j]=s[i][j];r[i][j]=s[i][j];}if(i&1){for(int j=1;j<m;j++){t[i][j]='1';}}else{for(int j=2;j<=m;j++){r[i][j]='1';}}}for(int i=1;i<=n;i++){q[i][1]=(s[i][1]!='1'?'1':'0');q[i][m]=(s[i][m]!='1'?'1':'0');for(int j=2;j<m;j++){q[i][j]='1';}}printf("+\n");for(int i=1;i<=n;i++){printf("%s\n",t[i]+1);}printf("+\n");for(int i=1;i<=n;i++){printf("%s\n",r[i]+1);}printf("-\n");for(int i=1;i<=n;i++){printf("%s\n",q[i]+1);}
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",s[i]+1);}if(check0()){solve0();return 0;}if(check1()){solve1();return 0;}if(check2()){solve2();return 0;}if(n==1){solven1();return 0;}if(m==1){solvem1();return 0;}if(m==2){ssolve();}else{solve();}return 0;
}

转载于:https://www.cnblogs.com/--BLUESKY007/p/11135879.html

noi.ac NA529 【神树的矩阵】相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. NOI.AC#2007-light【根号分治】

    正题 题目链接:http://noi.ac/problem/2007 题目大意 nnn个格子排成一排,每个格子有一个0/10/10/1和一个颜色.开始每个格子都是000,qqq次操作取反一个颜色的所有 ...

  3. NOI.AC#2139-选择【斜率优化dp,树状数组】

    正题 题目链接:http://noi.ac/problem/2139 题目大意 给出nnn个数字的序列aia_iai​.然后选出一个不降子序列最大化子序列的aia_iai​和减去没有任何一个数被选中的 ...

  4. NOI.AC#2144-子串【SAM,倍增】

    正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串sss和一个序列aaa.将字符串sss的所有本质不同子串降序排序后,求有多少个区间[l,r][l,r][l ...

  5. NOI.AC#2266-Bacteria【根号分治,倍增】

    正题 题目链接:http://noi.ac/problem/2266 题目大意 给出nnn个点的一棵树,有一些边上有中转站(边长度为222,中间有一个中转站),否则就是边长为111. mmm次询问一个 ...

  6. 野鸡NOI.AC模拟赛【2019.10.26】

    前言 截止至2019.10.2614:222019.10.26\ \ \ \ 14:222019.10.26    14:22 成绩 正题 T1:NOI.AC−T1:NOI.AC-T1:NOI.AC− ...

  7. 信息学奥赛一本通 1121:计算矩阵边缘元素之和 | OpenJudge NOI 1.8 03:计算矩阵边缘元素之和

    [题目链接] ybt 1121:计算矩阵边缘元素之和 OpenJudge NOI 1.8 03:计算矩阵边缘元素之和 [题目考点] 1. 二维数组 [解题思路] 解法1:遍历外圈 一个m行n列的矩阵, ...

  8. noi.ac 405 bzoj 4403 序列统计 题解

    博客观赏效果更佳 题意简述 noi.ac再次蒯题,实锤了- 请你求长度在 [ 1 , n ] [1,n] [1,n] 范围内,值域在 [ l , r ] [l,r] [l,r] 范围内的序列中,不下降 ...

  9. POJ 2778 AC自己主动机+矩阵幂 不错的题

    http://poj.org/problem?id=2778 有空再又一次做下,对状态图的理解非常重要 题解: http://blog.csdn.net/morgan_xww/article/deta ...

最新文章

  1. Java中的泛型方法
  2. 控件事件的绑定与取消
  3. c++ 反射_Java代码审计基础之反射
  4. 奇怪吸引子---一个奇妙的四维混沌吸引子
  5. 定义整型数组_C++数组的定义与初始化(学习笔记:第6章 01)
  6. 李炎恢老师Dreamweaver视频课程(53课时)[已完结]
  7. python故事_python的故事
  8. Java 高级数据结构 —— Properties
  9. 【转】中国北斗是咋回事?从GPS说起
  10. 新挑战新思路|山石网科互联网企业安全SD-WAN解决方案
  11. sap批量创建盘点凭证以及盘点凭证过账
  12. 计算机键盘pausebreak,键盘PauseBreak键作用
  13. 高等数学18讲(19版)7.31(区间再现公式)
  14. 大学生金融欺诈现状出炉 微博借钱提示四大典型骗局
  15. 安卓app开发工具_最新app制作软件汇总:从零开始教你完成app开发
  16. 处理器排行_2020新电脑处理器排行榜
  17. LaySNS模板仿RiPro日主题素材源码资源下载响应式CMS模板
  18. jasperprint java_关于jasperreport对应java打印机的解决方案
  19. 彩灯控制器课程设计vhdl_vhdl语言设计一个8路彩灯控制器
  20. 纯 CSS 实现绘制各种三角形(各种角度)

热门文章

  1. HTML表格,table,thead,tbody,tfoot,th,tr,td,的属性以及跨行,跨列
  2. bzoj5039:[Jsoi2014]序列维护
  3. ERP员工入登记查询(六)
  4. SpringMVC学习系列(8) 之 国际化
  5. Python之路_Day13
  6. PHP 接口开发注意事项
  7. VC#2005 Starter Kit: Screen Saver 使用介绍
  8. 树莓派dht11上云_树莓派使用 DHT11 / DHT22 温湿度传感器
  9. linux 操作系统中的谷歌浏览器google chrome打不开怎么解决
  10. 代码编译突然变缓慢问题解决办法(codeblock)