大型补档计划

题目链接

预处理每个列、行连续块。

每个每个列行只能在一个位置匹配,否则冲突。

符合二分图性质,跑匈牙利即可。

点数最坏情况 \(N * M\) (墙空地相间分布),边数最坏情况 \(N * M\) (每个点最多会加一条边),所以复杂度 \(O(N ^ 2M ^ 2)\) 跑得动

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 55;
int n, m, c1, c2, r[N][N], c[N][N], match[N * N];
char g[N][N];
int head[N * N], numE = 0;
bool vis[N * N];
struct E{
int next, v;
} e[N * N];
void add(int u, int v) {
e[++numE] = (E) { head[u], v };
head[u] = numE;
}
bool find(int u) {
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (vis[v]) continue;
vis[v] = true;
if (!match[v] || find(match[v])) {
match[v] = u; return true;
}
}
return false;
}
int main() {
int T; scanf("%d", &T);
for (int t = 1; t <= T; t++) {
numE = 0;
memset(match, 0, sizeof match);
memset(head, 0, sizeof head);
scanf("%d%d", &n, &m); c1 = c2 = 0;
for (int i = 1; i <= n; i++) scanf("%s", g[i] + 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] != '#') {
if (j > 1 && g[i][j - 1] != '#') r[i][j] = r[i][j - 1];
else r[i][j] = ++c1;
if (i > 1 && g[i - 1][j] != '#') c[i][j] = c[i - 1][j];
else c[i][j] = ++c2;
}
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (g[i][j] == 'o') add(r[i][j], c[i][j]);
int ans = 0;
for (int i = 1; i <= c1; i++) {
memset(vis, false, sizeof vis);
if (find(i)) ans++;
}
printf("Case :%d\n%d\n", t, ans);
} }

AcWing 406. 放置机器人的更多相关文章

  1. ZOJ 1654 Place the Robots(放置机器人)------最大独立集

    Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...

  2. OI总结(垃圾排版就忽略了吧)

    学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...

  3. TJOI2016 && HEOI2016 解题报告

    好吧我来写一波题解骗访问量QAQ 题目可以在cogs提交 bzoj4551~4456 D1T1 tree 树剖可做,然而有更简单的做法,10min搞定 维护一个并查集,时光倒流,如果当前点没有标记就把 ...

  4. ZOJ 1654 - Place the Robots (二分图最大匹配)

    题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能.每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人. 这个题和HDU 1045 -  Fire N ...

  5. php 简易验证码(GD库)

    论坛中为了防止灌水,出现了非常多的验证码的插件.如今这里介绍一个非常easy的自己定义验证码函数,这个验证码实现的原理就是通过php扩展的gd库来实现的. 给出百度百科对验证码的定义"验证码 ...

  6. ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...

  7. hdu 4003(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 思路:dp[i][j]表示以i为根选择j个机器人的最小花费,然后就是背包了:dp[u][i]=m ...

  8. ZOJ 1654--Place the Robots【二分匹配 &amp;&amp; 经典建图】

    Place the Robots Time Limit: 5 Seconds      Memory Limit: 32768 KB Robert is a famous engineer. One ...

  9. AcWing 24. 机器人的运动范围

    习题地址 https://www.acwing.com/solution/acwing/content/2970/ 题目描述地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼ ...

随机推荐

  1. Internet 网络协议族

    1.linux目前支持多种协议族,每个协议族用一个net_porto_family结构实例来表示,在初始化时,会调用sock_register()函数初始化注册到net_families[NPROTO ...

  2. leetcode bitmap系列问题整理

    1. 题目: 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例 : 输入: 11输出: 3解释: 整数 11 的二进制表示为 000000 ...

  3. 利用matlibplot绘制雷达图

    之前在一些数据分析案例中看到用 Go 语言绘制的雷达图,非常的漂亮,就想着用matlibplot.pyplot也照着画一个,遗憾的是matlibplot.pyplot模块中没有直接绘制雷达图的函数,不 ...

  4. parted会启动你的ceph osd,意外不?

    前言 如果看到标题,你是不是第一眼觉得写错了,这个怎么可能,完全就是两个不相关的东西,最开始我也是这么想的,直到我发现真的是这样的时候,也是很意外,还是弄清楚下比较好,不然在某个操作下,也许就会出现意 ...

  5. 删除osd的正确方式

    在ceph的集群当中关于节点的替换的问题,一直按照以前的方式进行的处理,处理的步骤如下: 停止osd进程 /etc/init.d/ceph stop osd.0 这一步是停止osd的进程,让其他的os ...

  6. bWAPP----PHP Code Injection

    PHP Code Injection 主要代码 1 <div id="main"> 2 3 <h1>PHP Code Injection</h1> ...

  7. mathtype样式系统使用技巧-通过样式定义来更改方程中的字体

    本教程中,我们主要介绍MathType Desktop的样式系统.演示如何通过更改样式定义来更改方程中的字体.通过样式可以快速轻松地实现我们所需的公式格式,并统一所有公式的样式. 我们以如下公式来作为 ...

  8. 他是 ISIJ 第四名,也是在线知名题库的洛谷“网红”

    转载自加藤惠. 2020年国际初中生信息学竞赛(ISIJ)上,以优秀成绩拿下第四名年仅初三的张湫阳,成为最夺目的选手之一. 而且虽然是初三的选手,但他取得优异成绩后,不少网友并不感到陌生,纷纷留言: ...

  9. JavaSE 学习笔记07丨IO流

    Chapter 13. IO流 13.1 File类 java.io.File类是文件(file)和目录(文件夹)(directory)路径名(path)的抽象表示,主要用于文件和目录的创建.查找和删 ...

  10. Java基础教程——运算符

    运算符 算术运算符 加 减 乘 除 取余 自加 自减 + - * / % ++ -- public class 算术运算符 { public static void main(String[] arg ...