题解 | 算法竞赛进阶指南 Muddy Fields

Muddy Fields

https://ac.nowcoder.com/acm/contest/1063/B

思路

因为木板可以重叠,所以如果放置木板,木板两端肯定都顶到底(障碍或者边界)是最优的.
这样就可以预处理出一些横向与纵向的联通块(宽度都为1).因为每一个方格必须被覆盖,所以该方格隶属的横向联通块与纵向联通块至少有一个被木板覆盖.
这样就可以构建二分图,横向联通块为左部图,纵向联通块为右部图,每一个方格都是一条边,跑二分图最小点覆盖即可.

代码

#include<bits/stdc++.h>
using namespace std;
#define i64 long long
#define fp( i, b, e ) for ( int i(b), I(e); i <= I; ++i )
#define fd( i, b, e ) for ( int i(b), I(e); i >= I; --i )
#define go( i, b ) for ( int i(b), v(to[i]); i; v = to[i = nxt[i]] )
template<typename T> inline void cmax( T &x, T y ){ x < y ? x = y : x; }
template<typename T> inline void cmin( T &x, T y ){ y < x ? x = y : x; }

clock_t t_bg, t_ed;
const int MAXN = 55, MAXV = 2505, MAXE = 2505;
int N, M;
char s[MAXN][MAXN];
int b1[MAXN][MAXN], b2[MAXN][MAXN], n, m;
int hd[MAXV], nxt[MAXE], to[MAXE], tot;
int mc[MAXV]; bool vis[MAXV];
inline void addedge( int x, int y ){
    nxt[++tot] = hd[x], hd[x] = tot, to[tot] = y;
}

bool DFS( int u ){
    go( i, hd[u] ) if ( !vis[v] ){
        vis[v] = 1; if ( !mc[v] || DFS(mc[v]) ) return mc[v] = u, 1;
    } return 0;
}

int main(){
    t_bg = clock();
    scanf( "%d%d", &N, &M );
    fp( i, 1, N ) scanf( "%s", s[i] + 1 );
    fp( i, 1, N ) fp( j, 1, M ) if ( s[i][j] == '*' ){
        if ( s[i][j - 1] == '*' ) b1[i][j] = b1[i][j - 1];
        else b1[i][j] = ++n;
        if ( s[i - 1][j] == '*' ) b2[i][j] = b2[i - 1][j];
        else b2[i][j] = ++m;
        addedge( b1[i][j], b2[i][j] );
    } int ans(0); fp( i, 1, n ) memset( vis, 0, sizeof vis ), ans += DFS(i);
    printf( "%d\n", ans );
    t_ed = clock();
    fprintf( stderr, "\n========info========\ntime : %.3f\n====================\n", (double)( t_ed - t_bg ) / CLOCKS_PER_SEC );
    return 0;
}
全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
04-08 20:03
已编辑
点赞 评论 收藏
转发
咋六月了还有面试啊,有兄弟了解这个部门吗一面结束更新更新面完了家人们,纯纯kpi啊,上来就是一道题是打印多个字符串的笛卡尔积,库吃库吃写完了,结果又来一道协程调度的题。做题就做了40分钟,也没开摄像头,也没有反问,也没有八股,最后面试官跑路的时候被我拉住问了一个问题然后不耐烦的回答一句话跑路了。收到二面邀请更新反转了家人们,刚接到邮件,明天二面,这都能二面啊,做完第一个题的时候我以为就结束了。结果面试官说,“再做一个吧”,我到时没绷住就乐了,他还问我笑啥,(我当然是笑kpi太明显啊),结果进二面了还,明天再探吧。二面结束更新刚刚结束面试,新鲜出炉热乎的面经。二面面试官一改一面面试官懒懒洋洋的作风,也开了摄像头,这是本菜鸟经历的最全面的一次面试,有拷打项目、有八股、有场景题、有手撕、有shell编程题(我直接投降)、有智力题面试官水平很高,很发散,问的也很全,就是网络有点卡顿加上面试官说话稍微带点口音,导致有些问题听不清楚。八股的范围基本也就围绕后端老四样,外加项目上的相关知识。我个人感受是大概率寄了,但是面试体验挺好,只不过有些题我直接就投降了,投降的有点多感觉,而且算法也没写到让面试官满意的程度。关于一面的两道手撕第一道可以理解为有多个字符串数组,每个数组里有多个字符串,求笛卡尔积第二道是并发三个协程,有序打印1、2、3三个数字,要求第一个协程打印一百次,第二个两百次,第三个三百次。大概是这个意思。
查看2道真题和解析
点赞 评论 收藏
转发
点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151388次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11201次浏览 101人参与
# OPPO开奖 #
19198次浏览 267人参与
# 和牛牛一起刷题打卡 #
18954次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203365次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4971次浏览 30人参与
# 不去互联网可以去金融科技 #
20346次浏览 255人参与
# 通信硬件薪资爆料 #
265889次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2220次浏览 34人参与
# 互联网公司评价 #
97679次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25035次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454846次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53898次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14644次浏览 349人参与
# 硬件人的简历怎么写 #
82285次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19395次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28077次浏览 248人参与
# 学历对求职的影响 #
161230次浏览 1804人参与
# 你收到了团子的OC了吗 #
538694次浏览 6386人参与
# 你已经投递多少份简历了 #
344196次浏览 4963人参与
# 实习生应该准时下班吗 #
96971次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63519次浏览 622人参与
牛客网
牛客企业服务