CF1592F2 Alice and Recoloring 2
目前在看贪心/构造/DP 杂题选做,发现一道非常不错的结论题,具有启发意义。
先说明如下结论
结论一:如何怎么样都不会使用二和三操作
证明:
二三操作显然可以通过两次一操作达到,而其操作费用大于两次一操作费用
所以显然我们只会操作一四操作。
那么我们发现翻转一整个矩形不好操作,翻转到一特定状态也不好处理,不如考虑倒序操作:即给定特定状态变为全白状态的费用,知其与原问题等价。
然后我们处理翻转问题,我们考虑一个转换
\(a_{i,j} = a_{i,j}\ xor\ a_{i+1,j}\ xor\ a_{i,j + 1}\ xor\ a_{i + 1,j + 1}\)。
我们发现全白时显然全等为\(0\)。
而一四操作我们可以将其本质变为:
一操作:单点翻转\((x,y)\)
四操作:四点翻转\((x,y),(x,m),(n,y),(n,m)\)
那么问题变得显然起来。
我们依旧给出了两个结论
结论二:不用同时使用两个横坐标或竖坐标相等的四操作
证明:其等价于修改四个任意散点,其可以等价于四次一操作的费用
结论三:除非 \((x,y),(n,y),(x,m)\) 都为1,才会使用 \((x,y)\) 这一四操作
证明:如果有一个不为\(1\),那么其有一个错误反转,我们需要其一个一操作反转回来,那么其等价于\(1 + 2 = 3\),可以使用一操作代替。
那么经典问题转化为满足某种条件的改变行列取点数量。
二分图上最大匹配即可。
#include<iostream>
#include<cstdio>
#include<queue>
#define ll long long
#define N 30000
int n,m;
int head[N];
int cnt = 1;
struct P{
int to,next;
ll v;
}e[N << 2];
inline void add(int x,int y,int v){
e[++cnt].to = y;
e[cnt].v = v;
e[cnt].next = head[x];
head[x] = cnt;
}
std::queue<int>QWQ;
ll dis[N];
bool vis[N];
int a[505][505];
int s,t;
inline bool bfs(){
for(int i = 1;i <= n + m + 2;++i)
dis[i] = 1e10,vis[i] = 0;
dis[s] = 0;
QWQ.push(s);
vis[s] = 1;
while(!QWQ.empty()){
int u = QWQ.front();
QWQ.pop();
vis[u] = 0;
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(dis[v] > dis[u] + 1 && e[i].v){
dis[v] = dis[u] + 1;
if(!vis[v])
vis[v] = 1,QWQ.push(v);
}
}
}
return dis[t] != 1e10;
}
inline ll dfs(int u,ll in){
ll out = 0;
if(u == t)
return in;
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(e[i].v && dis[v] == dis[u] + 1){
int to = dfs(v,std::min(e[i].v,in));
e[i].v -= to;
e[i ^ 1].v += to;
in -= to;
out += to;
}
}
if(out == 0)
dis[u] = 0;
return out;
}
inline int dinic(){
int ans = 0;
while(bfs())
ans += dfs(s,1e18);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j){
char s = getchar();
while(s != 'W' && s != 'B')
s = getchar();
a[i][j] = (s == 'B');
s = '.';
}
int ans = 0;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j){
a[i][j] = a[i][j] ^ a[i + 1][j] ^ a[i + 1][j + 1] ^ a[i][j + 1];
}
// for(int i = 1;i <= n;++i,puts(""))
// for(int j = 1;j <= m;++j)
// std::cout<<a[i][j]<<" ";
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j){
if(a[i][m] && (a[n][j] && a[i][j])){
add(i,n + j,1);
add(n + j,i,0);
}
}
s = n + m + 1,t = n + m + 2;
for(int i = 1;i < n;++i)
add(s,i,1),add(i,s,0);
for(int j = 1;j < m;++j)
add(n + j,t,1),add(t,n + j,0);
int k = dinic();
a[n][m] = a[n][m] ^ (k & 1);
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
ans += a[i][j];
std::cout<<ans - k<<std::endl;
}//注意建图后的点集大小
CF1592F2 Alice and Recoloring 2的更多相关文章
- 贪心/构造/DP 杂题选做
本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
- (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...
- 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob
Alice and Bob Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
- Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...
- 阿里前端框架Alice是个不错的选择
BootStrap虽然用户群体广大,其整体风格尽管有不少skin可选,但以国情来看还是不好看. 阿里开源的前端框架,个人觉得还是很不错,Alice处处透着支付宝中界面风格的气息,电商感挺强. 以下内容 ...
- poj 1698 Alice‘s Chance
poj 1698 Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...
- Alice and Bob 要用到辗转相减
Alice and BobTime Limit: 1 Sec Memory Limit: 64 MBSubmit: 255 Solved: 43 Description Alice is a be ...
随机推荐
- Java(44)JDK新特性之函数式接口
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201667.html 博客主页:https://www.cnblogs.com/testero ...
- C# 提取PDF中的表格
本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的类以及方法等来获取表格单元格中的文本内容:代码内容中涉及到的主要类及方法归纳 ...
- 命名空间、作用域、LEGB法则、垃圾回收机制
一.命名空间.作用域.LEGB法则. 1.命名空间和作用域 : 命名空间:变量名称与值的映射关系 作用域:变量作用的区域,即范围. 注意:class/def/模块会产生作用域:分支语句,循环语句,异常 ...
- PyCharm中目录directory与包package的区别及相关import详解
一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dire ...
- springcloud (一)系统架构演变之路
演变过程 从传统架构(单点应用)→分布式架构(以项目进行拆分)→SOA架构(面向服务架构)→微服务架构 1 传统架构 其实就是ssh架构或者ssm架构,属于单点应用,把整个开发业务模块都会在一个项目中 ...
- android tcp通讯
Andoird TCP通讯 前言 最近在写一个即时通讯的项目,有一些心得,写出来给大家分享指正一下. 简单描述一下这个项目: 实时查询车辆运行状态的项目,走TCP通迅. 接口采用GZIP压缩. 后台是 ...
- 按照工业标准1英寸=25.4mm,而在电子元件成像领域Sensor尺寸1英寸=16mm。
按照工业标准1英寸=25.4mm,而在电子元件成像领域Sensor尺寸1英寸=16mm. 我们平常所说的CCD/CMOS的尺寸,实际上是指Sensor对角线的长度,这一点跟我们平常所说的屏幕尺寸是一样 ...
- STM32 PWM功能在关闭时GPIO电平不确定的情况
刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况.在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确 ...
- MVC下垃框的使用
--------------模型-------------------- /// <summary> /// 状态 /// =0 下架 =1 上架 /// </summary> ...
- 【linux命令】 磁盘管理
du du是查看硬盘的使用情况,统计文件或目录的空间大小. -a 显示所有目录或文件的大小 -b 以byte为单位,显示目录或文件的大小 -c 显示目录或文件的总和 -k 以KB为单位输出 -m 以M ...