CF1592F2 Alice and Recoloring 2 题解
操作
设
则操作
操作
注意到所有操作
则问题转化为求最多能找出多少
以
一次操作
注意
若
若
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
struct E{int v, w, t;}e[250050];
int n, m, r, p, c = 1, s, t, d[1050], g[1050], h[1050];
bool a[550][550], b[550][550];char z;queue<int> q;
void A(int u, int v, int w) {e[++c] = {v, w, h[u]};h[u] = c;}
bool B()
{
memset(d, 0, sizeof d);d[s] = 1;q.push(s);while(!q.empty())
{
int u = q.front();q.pop();g[u] = h[u];for(int i = h[u], v;i;i =
e[i].t) if(e[i].w && !d[v = e[i].v]) d[v] = d[u] + 1, q.push(v);
}
return d[t];
}
int D(int u, int f)
{
if(u == t) return f;
int k, q = 0;
for(int i = g[u], v;i && f;i = e[i].t)
{
g[u] = i;
if(e[i].w && d[v = e[i].v] == d[u] + 1)
k = D(v, min(e[i].w, f)), e[i].w -= k, e[i ^ 1].w += k, q += k, f -= k;
}
return q;
}
int main()
{
scanf("%d%d", &n, &m);t = n + m;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
scanf(" %c", &z), a[i][j] = z == 'B';
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
b[i][j] = a[i][j] ^ a[i + 1][j] ^ a[i][j + 1] ^ a[i + 1][j + 1];
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
r += b[i][j];
for(int i = 1;i < n;++i)
for(int j = 1;j < m;++j)
if(b[i][j] && b[i][m] && b[n][j])
A(i, j + n, 1), A(j + n, i, 0);
for(int i = 1;i < n;++i) A(0, i, 1), A(i, 0, 0);
for(int i = 1;i < m;++i) A(i + n, t, 1), A(t, i + n, 0);
while(B()) p += D(0, 1e9);r -= p;
r -= b[n][m] && p & 1;
r += !b[n][m] && p & 1;
return !printf("%d", r);
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具