洛谷

题意:

给出一个\(n*m\)的矩阵\(A\)。现要从中选出\(n\)个数,任意两个数不能在同一行或者同一列。

现在问选出的\(n\)个数中第\(k\)大的数的最小值是多少。

思路:

显然二分一下答案,然后找出所有不超过二分答案的边求最大匹配,判断一下是否小于\(n-k+1\)即可。

  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2019/11/7 15:27:40
  4. */
  5. #include <bits/stdc++.h>
  6. #define MP make_pair
  7. #define fi first
  8. #define se second
  9. #define sz(x) (int)(x).size()
  10. #define all(x) (x).begin(), (x).end()
  11. #define INF 0x3f3f3f3f
  12. #define Local
  13. #ifdef Local
  14. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  15. void err() { std::cout << '\n'; }
  16. template<typename T, typename...Args>
  17. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  18. #else
  19. #define dbg(...)
  20. #endif
  21. void pt() {std::cout << '\n'; }
  22. template<typename T, typename...Args>
  23. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  24. using namespace std;
  25. typedef long long ll;
  26. typedef pair<int, int> pii;
  27. //head
  28. const int N = 255, M = 1e5 + 5;
  29. int n, m, k;
  30. int val[N][N];
  31. struct Edge{
  32. int v, next;
  33. }e[M];
  34. int head[N], tot;
  35. void adde(int u, int v) {
  36. e[tot].v = v; e[tot].next = head[u]; head[u] = tot++;
  37. }
  38. int T, vis[N];
  39. int match[N];
  40. int dfs(int u) {
  41. for(int i = head[u]; i != -1; i = e[i].next) {
  42. int v = e[i].v;
  43. if(vis[v] != T) {
  44. vis[v] = T;
  45. if(match[v] == -1 || dfs(match[v])) {
  46. match[v] = u;
  47. return 1;
  48. }
  49. }
  50. }
  51. return 0;
  52. }
  53. bool chk(int x) {
  54. memset(head, -1, sizeof(head)); tot = 0;
  55. for(int i = 1; i <= n; i++) {
  56. for(int j = 1; j <= m; j++) {
  57. if(val[i][j] <= x) adde(i, j);
  58. }
  59. }
  60. memset(match, -1, sizeof(match));
  61. int ans = 0;
  62. for(int i = 1; i <= n; i++) {
  63. ++T; ans += dfs(i);
  64. }
  65. return ans >= n - k + 1;
  66. }
  67. void run(){
  68. for(int i = 1; i <= n; i++) {
  69. for(int j = 1; j <= m; j++) {
  70. cin >> val[i][j];
  71. }
  72. }
  73. int l = 1, r = INF, mid;
  74. while(l < r) {
  75. mid = (l + r) >> 1;
  76. if(chk(mid)) r = mid;
  77. else l = mid + 1;
  78. }
  79. cout << l << '\n';
  80. }
  81. int main() {
  82. ios::sync_with_stdio(false);
  83. cin.tie(0); cout.tie(0);
  84. cout << fixed << setprecision(20);
  85. while(cin >> n >> m >> k) run();
  86. return 0;
  87. }

【洛谷P4251】[SCOI2015]小凸玩矩阵(二分+二分图匹配)的更多相关文章

  1. [bzoj4443] [loj#2006] [洛谷P4251] [Scoi2015]小凸玩矩阵

    Description 小凸和小方是好朋友,小方给小凸一个 \(N \times M\)( \(N \leq M\) )的矩阵 \(A\) ,要求小秃从其中选出 \(N\) 个数,其中任意两个数字不能 ...

  2. 【BZOJ4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配

    [BZOJ4443][Scoi2015]小凸玩矩阵 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或 ...

  3. 洛谷 4251 [SCOI2015]小凸玩矩阵

    [题解] 二分答案+二分图匹配. 先二分最小值Min,然后扫一遍这个矩阵,把满足a[i][j]<=Min的i,j连边,之后跑二分图匹配,如果最大匹配数大于等于n-k+1,当前的Min即是合法的. ...

  4. [LUOGU] P4251 [SCOI2015]小凸玩矩阵

    行列看成点,格子看成边,二分一个边权,删去大于它的边,新图上的最大流>k则答案可以更优,小于k则调整左边界. #include<algorithm> #include<iost ...

  5. BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配

    BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...

  6. 2018.06.30 BZOJ4443: [Scoi2015]小凸玩矩阵(二分加二分图匹配)

    4443: [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N< ...

  7. BZOJ 4443: [Scoi2015]小凸玩矩阵 最大流

    4443: [Scoi2015]小凸玩矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4443 Description 小凸和小方是好 ...

  8. bzoj 4443 [Scoi2015]小凸玩矩阵 网络流,二分

    [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1564  Solved: 734[Submit][Status][Di ...

  9. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. python获取指定文件夹下的文件和文件夹

    import os filepaths = []; dirpaths = []; pathName = r'C:\anfei\json\20191128' for root, dirs, files ...

  2. 模拟超市付款 (if 多分支结构)

    """ 模拟超市付款: 商品单价 商品数量 键盘上输入商品单价,以及商品数量, 然后计算应付总额 计算总额 float 提示用户可以有4种付款方式 不同的付款方式有不同的 ...

  3. Linux内核源码分析--内核启动之zImage自解压过程【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/3838245.html 阅读目录(Content) zImage来历 piggy.gz压缩文件的特点 vmli ...

  4. python接口自动化根据请求接口类型进行封装

    根据不同的请求类型(GET/POST)进行接口请求封装 import requests import json class RunMain: def __init__(self, url, metho ...

  5. jstree级联禁用后代节点的选择框

    用jstree+jquery,做的树形展示. 这个话题,在Stack Overflow上有问答,要获取要禁用的节点,然后用获取子节点方法遍历后代节点,设置禁用选择框. 之后发现,jstree的获取子节 ...

  6. The 2019 Asia Nanchang First Round Online Programming Contest

    传送门 A. Enju With math problem 题意: 给出\(a_1,\cdots,a_{100}\),满足\(a_i\leq 1.5*10^8\). 现在问是否存在一个\(pos\), ...

  7. 201871010111-刘佳华《面向对象程序设计(java)》第十四周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十四周学习总结 实验十二  Swing图形界面组件(一) 实验时间 2019-11-29 第一部分:基础知识总结 1.设计 ...

  8. git pull出错:cannot pull into a repository with state: merging_resolved"

    git pull 出错解放办法:1.尝试先提交现有代码到本地,再更新2.git reset —hard

  9. networkx生成网络的子网计算

    当我们用networkx生成网络时,节点之间的关系是随机的,很多时候我们生成的一个网络,存在不止一个子网,也就是说任意两个节点之间不一定连通 当我们想生成一个任意两点都能连通的网络时,就需要去判断生成 ...

  10. P3525 INS-Inspection

    这道题的题面有点问题,如果按照题面做,应该是A不了的,下面引用一下评论里@REM_001的翻译 一棵n个节点的树,行动中心S从1->N.从S出发前往任意一个未标记到的点(沿树上两点的唯一路径走) ...