题目链接

题意

N×MN×MN×M的矩阵选择KKK个数相邻的数字不能同时选择,让最小的数字最大。

思路

二分枚举答案,对于每个答案,DinicDinicDinic判断可行性。

#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 1e3 + 1;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
struct ac{int v, c, pre;
}edge[maxn<<8];
int s, e;
int head[maxn<<2], dis[maxn+10], curedge[maxn<<2], cnt;
void init() {mem(head, -1);cnt = 0;
}
void addedge(int u, int v, int c) { // 记得双向边edge[cnt] = {v, c, head[u]};head[u] = cnt++;
}
bool bfs() {queue<int> que;que.push(s);mem(dis, 0);dis[s] = 1;while (!que.empty()) {int f = que.front();que.pop();for (int i = head[f]; i != -1; i = edge[i].pre) {if (dis[edge[i].v] || edge[i].c == 0) continue;dis[edge[i].v] = dis[f] + 1;que.push(edge[i].v);}}return dis[e] > 0;
}int dfs(int now, int flow) {if (now == e || flow == 0) return flow;for (int &i = curedge[now]; i != -1; i = edge[i].pre) { // 当前弧优化if (dis[edge[i].v] != dis[now] + 1 || edge[i].c == 0) continue;int d = dfs(edge[i].v, min(flow, edge[i].c));if (d > 0) {edge[i].c -= d;edge[i^1].c += d;return d;}            }dis[now] = -1; // // 炸点优化return 0;
}
int Dinic() {int sum = 0, d;while (bfs()) {for (int i = 0; i <= e; ++i) curedge[i] = head[i];while (d = dfs(s, inf)) sum += d;}return sum;
}
int a[maxn][maxn];
int n, m, k;
int odd(int x, int y) {return ((x + y) % 2);
}
int pos(int x, int y) {return (x * m + y + 1);
}
int judge(int x, int y) {if (x < 0 || y < 0 || x >= n || y >= m) return 1;if (odd(x, y)) return 1;return 0;
}
int check(int x) {int sum = 0;init();s = 0, e = n * m + 1;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (a[i][j] < x) continue;sum++;if (odd(i, j)) {addedge(s, pos(i, j), 1);addedge(pos(i, j), s, 0);for (int k = -1; k <= 1; ++k) {for (int h = -1; h <= 1; ++h) {if (abs(k) + abs(h) != 1) continue;int ii = i + k;int jj = j + h;if (judge(ii, jj)) continue;addedge(pos(i, j), pos(ii, jj), inf);addedge(pos(ii, jj), pos(i, j), 0);}}}else {addedge(pos(i, j), e, 1);addedge(e, pos(i, j), 0);}}}if (sum - Dinic() >= k) return 1;return 0;
}
int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T;scanf("%d", &T);while (T--) {scanf("%d%d%d", &n, &m, &k);for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {scanf("%d", &a[i][j]);}}int l = 1, r = 1000;while (l <= r) {if (check(mid)) l = mid + 1;else r = mid - 1;}printf("%d\n", r);}return 0;
}

牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)相关推荐

  1. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

  2. 牛客题霸 [数组中未出现的最小正整数] C++题解/答案

    牛客题霸 [数组中未出现的最小正整数] C++题解/答案 题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, 3, 4].返回1 arr = [1, 2, ...

  3. 牛客 contest897 C-Latale(树上dp)

    题意 N个节点的树,每条边有条权值,问有多少个点对(U,V)(U, V)(U,V),使得UUU到VVV的距离是3的倍数. 思路 dfs1dfs1dfs1处理每个节点包含子树的dis[dis[%3 = ...

  4. 【牛客 -2A】矩阵(二分,字符串哈希)

    题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...

  5. 牛客多校10 - Identical Trees(dp+二分图最小权匹配)

    题目链接:点击查看 题目大意:给出两个同构树 tree1 和 tree2 ,问最少需要改变多少个结点的标号,可以使得这两棵树相同 题目分析:直接 dfs 维护 dp 就好了,dp[ i ][ j ] ...

  6. 牛客题霸题目及题解汇总

    牛客题霸 单链表的选择排序 C++题解/答案 牛客题霸 最少素数拆分 C++题解/答案 牛客题霸 两数之和 C++题解/答案 牛客题霸 反转链表 C++题解/答案 牛客题霸 二分查找 C++题解/答案 ...

  7. Cutting Bamboos(牛客多校第九场H主席树+二分+思维)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 There are n bamboos arranged in a line. The i-th ...

  8. 2019牛客暑期多校训练营(第九场)H Cutting Bamboos(主席树+二分)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 题目描述 There are n bamboos arranged in a line. The ...

  9. 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)

    链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...

最新文章

  1. b-blkid查看磁盘设备文件系统类型
  2. 如何在DataGrid里面产生滚动条而不滚动题头
  3. php导包,Thinkphp5.1 导入第三方包的问题
  4. 最长公共子序列问题 (LCS)
  5. 【高斯消元】球形空间产生器(luogu 4035/金牌导航 高斯消元-1)
  6. java gradle 资源访问_java在gradle工程访问src/test/resources目录下的资源配置文件
  7. python编辑编程器_用Python制作编辑器
  8. socket实现一个简单的echo服务
  9. mybatis 存储过程 tmp_count_MyBatis从入门到精通
  10. leetcode------Flatten Binary Tree to Linked List
  11. Windows:Win10商店找回
  12. linux igb网卡,网卡驱动程序igb ixgbe
  13. 纯生js ajax,纯生js实现Element中input组件的部分功能(慢慢完善)并封装成组件
  14. LVM Linear vs Striped Logical Volumes
  15. 物质、分子、原子、原子核、中子、质子、电子、量子、离子的区别
  16. 9、★♥★基于STM32单片机的颜色检测仪设计♥☆
  17. HIT-ICS2020大作业
  18. 数据库被占用怎么办?
  19. 区块链隐私保护:MimbleWimble 和 Grin 简介
  20. 藏文驾考科目一科目四理论题库

热门文章

  1. Android中的APinner2
  2. Qt5.9使用QWebEngineView加载网页速度非常慢,问题解决
  3. 学用MVC4做网站五:5.1添加文章
  4. 企业组织机构代码验证JavaScript版和Java版 - 修正版V20090214
  5. 简单工厂之简单模型(uml)
  6. [基础题] 6.(*)按如下要求编写Java程序: (1)编写一个接口:OneToN,只含有一个方法int dispose(int n)
  7. [Android] The connection to adb is down, and a severe error has occured
  8. 【数据结构与算法】之深入解析“下一个更大元素II”的求解思路与算法示例
  9. 209. Minimum Size Subarray Sum 长度最小的子数组
  10. python 出现 AttributeError: matplotlib‘ object has no attribute ‘to_rgba‘