将每一行和每一列分别作为一个点,当第$i$行第$j$列的格子为红色时,将第$i$行与第$j$列连边

此时,考虑选择第$i$行的红色格子并将第$i$行的格子全部改成白色:

关于这一操作的条件,即需要第$i$行有红色格子,从图中来看也即第$i$行对应的点度非0

关于这一条件的影响,即第$i$行的红色格子都没了,从图中来看也即删去第$i$行对应的点所有出边

根据上述分析,每一次操作即在图中选择一个度非0的点,并删除其所有出边,并且设最终选择了$x$个行对应的点和$y$个列对应的点,最大化$nm-(n-x)(m-y)$

考虑其中的一个连通块(连通块之间显然是独立的),我们可以仅保留这个连通块中的任意一个点,并选择该连通块中其余的点

具体来说,任取该连通块的一个生成树,并以需要保留的点为根,每一次不断选择一个叶子即可

另一方面,显然无论如何我们都不可能删除一个连通块中的所有点,因此这已经最优了

同时,我们仅关心每一个连通块中未选的点是行还是列,一个点的连通块显然不需要考虑,多个点的连通块必然同时含有行和列的点

由此,求出所有连通块(不考虑一个点的连通块)的数量$k$以及$x-1$和$y-1$之和$X$和$Y$(其中$x$和$y$为该连通块中行和列对应的点数量),问题即求$f(x)=nm-(n-X-x)(m-Y-k+x)$在$x\in [0,k]$的最大值,利用二次函数简单讨论即可

方案根据上面的分析也不难构造,时间复杂度为$o(nm)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2505
4 struct Edge{
5 int nex,to;
6 }edge[N*N*2];
7 struct Op{
8 int type,x,y;
9 };
10 vector<int>v[N<<1];
11 vector<Op>ans;
12 int E,n,m,x,y,scc,head[N<<1],vis[N<<1];
13 char s[N][N];
14 void add(int x,int y){
15 edge[E].nex=head[x];
16 edge[E].to=y;
17 head[x]=E++;
18 }
19 void dfs(int k){
20 if (vis[k])return;
21 vis[k]=1;
22 v[scc].push_back(k);
23 for(int i=head[k];i!=-1;i=edge[i].nex)dfs(edge[i].to);
24 }
25 void dfs(int k,int fa){
26 if (vis[k])return;
27 vis[k]=1;
28 for(int i=head[k];i!=-1;i=edge[i].nex)dfs(edge[i].to,k);
29 if (fa>=0){
30 if (k<n)ans.push_back(Op{0,k,fa-n});
31 else ans.push_back(Op{1,fa,k-n});
32 }
33 }
34 void write(){
35 printf("%d\n",ans.size());
36 for(int i=0;i<ans.size();i++){
37 ans[i].x++,ans[i].y++;
38 if (ans[i].type==0)printf("X %d %d\n",ans[i].x,ans[i].y);
39 else printf("Y %d %d\n",ans[i].x,ans[i].y);
40 }
41 }
42 int main(){
43 scanf("%d%d",&n,&m);
44 memset(head,-1,sizeof(head));
45 for(int i=0;i<n;i++){
46 scanf("%s",s[i]);
47 for(int j=0;j<m;j++)
48 if (s[i][j]=='R'){
49 add(i,j+n);
50 add(j+n,i);
51 }
52 }
53 for(int i=0;i<n+m;i++)
54 if (!vis[i]){
55 v[++scc].clear();
56 dfs(i);
57 if (v[scc].size()==1)scc--;
58 else{
59 x--,y--;
60 for(int j=0;j<v[scc].size();j++){
61 if (v[scc][j]<n)x++;
62 else y++;
63 }
64 }
65 }
66 memset(vis,0,sizeof(vis));
67 if (m-n+x-y<0){
68 for(int i=1;i<=scc;i++)
69 for(int j=0;j<v[i].size();j++)
70 if (v[i][j]<n){
71 dfs(v[i][j],-1);
72 break;
73 }
74 write();
75 }
76 else{
77 for(int i=1;i<=scc;i++)
78 for(int j=0;j<v[i].size();j++)
79 if (v[i][j]>=n){
80 dfs(v[i][j],-1);
81 break;
82 }
83 write();
84 }
85 }

[atARC119D]Grid Repainting 3的更多相关文章

  1. AtCoder Beginner Contest 088 D Grid Repainting

    Problem statement We have an H×W grid whose squares are painted black or white. The square at the i- ...

  2. ExtJS 4.2 Grid组件的单元格合并

    ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid ...

  3. WPF中Grid实现网格,表格样式通用类

    /// <summary> /// 给Grid添加边框线 /// </summary> /// <param name="grid"></ ...

  4. 在 Windows Phone 中,为 Grid 添加 Tilt 效果

    在 Windows Phone 中,Tilt 效果是比较经典的效果,我们可以很简单的为按钮等控件添加这样的效果(使用 Windows Phone Toolkit 的Tilt 效果),但是,如果我们想要 ...

  5. wpf 列表、菜单 收起与展开,通过Grid DoubleAnimation或者Expander实现

    菜单收缩有很多种方法具体如何实现还是看个人想法: 第一种通过后台控制收起与展开: 效果图: 代码 : <Grid> <Grid.ColumnDefinitions> <C ...

  6. Sencha ExtJS 6 Widget Grid 入门

    最近由于业务需要,研究了一下Sencha ExtJS 6 ,虽然UI和性能上据相关资料说都有提升,但是用起来确实不太顺手,而且用Sencha cmd工具进行测试和发布,很多内部细节都是隐藏的,出了问题 ...

  7. WPF CheckBox样式 ScrollViewer样式 WrapPanel、StackPanel、Grid布局

    本节讲述布局,顺带加点样式给大家看看~单纯学布局,肯定是枯燥的~哈哈 那如上界面,该如何设计呢? 1.一些布局元素经常用到.Grid StackPanel Canvas WrapPanel等.如上这种 ...

  8. [转]ExtJS Grid 分页时保持选中的简单实现方法

    原文地址 :http://www.qeefee.com/article/ext-grid-keep-paging-selection ExtJS中经常要用到分页和选择,但是当选择遇到分页的时候,杯具就 ...

  9. [转]extjs grid的Ext.grid.CheckboxSelectionModel默认选中解决方法

    原文地址:http://379548695.iteye.com/blog/1167234 grid的复选框定义如下:   var sm = new Ext.grid.CheckboxSelection ...

随机推荐

  1. Dapr + .NET Core实战(十一)单机Dapr集群负载均衡

    如何单机部署Dapr集群 第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载. 首先要说的是单机下,通过 da ...

  2. IDEA Web渲染插件开发(二)— 自定义JsDialog

    <IDEA Web渲染插件开发(一)>中,我们了解到了如何编写一款用于显示网页的插件,所需要的核心知识点就是IDEA插件开发和JCEF,在本文中,我们将继续插件的开发,为该插件的JS Di ...

  3. 国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?

    作者 | 王骜 来源 | Serverless 公众号 导读 ​ USENIX ATC (USENIX Annual Technical Conference) 学术会议是计算机系统领域的顶级会议,入 ...

  4. .NET Reflector软件破解

    转自:https://blog.csdn.net/zxy13826134783/article/details/89057871 软件和注册机下载地址: 链接:https://pan.baidu.co ...

  5. NOI 2021 部分题目题解

    最近几天复盘了一下NOI 2021,愈发发觉自己的愚蠢,可惜D2T3仍是不会,于是只写前面的题解 Day1 T1 可以发现,每次相当于将 \(x\to y\) 染上一种全新颜色,然后一条边是重边当且仅 ...

  6. bzoj1834 ZJOI2010网络扩容(费用流)

    给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容费用. 其中\(n ...

  7. hdu4479 (数学题)(算术基本定理)

    题目大意 给定一个三元组\((x,y,z)\)的\(gcd\)和\(lcm\),求可能的三元组的数量是多少,其中三元组是的具有顺序的 其中\(gcd\)和\(lcm\)都是32位整数范围之内 由算术基 ...

  8. Perl操作excel2007的模块

    详细版:https://www.jianshu.com/p/84bda53827c8 第一种方法: 读写excel2007文档的perl模块: Spreadsheet::XLSX(读)和Spreads ...

  9. Java:Iterator接口与fail-fast小记

    Java:Iterator接口与fail-fast小记 对 Java 中的 Iterator接口 和 fail-fast,做一个微不足道的小小小小记 Iterator Iterator接口 Itera ...

  10. 数据治理之元数据管理的利器——Atlas入门宝典

    随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程.作为Hadoop生态最紧密的元数据管理与发现工具,Atlas在其中扮演着重要的位置.但是其官方文档不是很丰富,也不够详细.所以整 ...