Description

小凸和小方是好朋友,小方给小凸一个 \(N \times M\)( \(N \leq M\) )的矩阵 \(A\) ,要求小从其中选出 \(N\) 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 \(N\) 个数中第 \(K\) 大的数字的最小值是多少。

Input

第一行给出三个整数 \(N\) , \(M\) , \(K\)

接下来 \(N\) 行,每行 \(M\) 个数字,用来描述这个矩阵

Output

如题

Sample Input

3 4 2

1 5 6 6

8 3 4 3

6 8 6 3

Sample Output

3

HINT

\(1 \leq K \leq N \leq M \leq 250\) , \(1 \leq 矩阵元素 \leq 10^9\)


想法

题中的“小秃” 怕不是再说我呜呜

看到 第 \(k\) 大最小,下意识想到二分。

可二分需要满足有单调性啊?这道题中第 \(k\) 大的数肯定不是越大越满足条件的,满足条件的应是一段区间。

但我们仍可二分这个值的下限 \(x\) ,要满足从 \(\leq x\) 的元素中可选出 \(n-k+1\) 个合法的。

怎么判断能不能选出 \(n-k+1\) 个合法的呢?

我一开始竟一直想怎么数据结构搞…

后来才意识到,“任两个不能在同一行或同一列” 是个挺经典的模型:把行和列当成点,将可选的元素所在的行与列连边,跑二分图匹配就好了。

这样我们得到下限 \(x\) 了,但仍有一个问题,能不能选出 \(k-1\) 个 \(\geq x\) 的元素构成一个合法方案呢?

好巧的是,一定可以。

简略证明如下:

既然 \(x\) 是下限,那么在 \(\leq x-1\) 的元素中一定选不出 \(n-k+1\) 个构成合法方案

那么在当前选了 \(n-k+1\) 个元素后再随便选 \(k-1\) 个元素构成合法方案,这 \(n\) 个元素中 \(\leq x-1\) 的 \(<n-k+1\)

也就是说 \(\geq x\) 的至少有 \(k\) 个。

那么,在我们选出的元素中,二分保证了 \(\leq x\) 的至少有 \(n-k+1\) 个,上面的证明保证 \(\geq x\) 的至少有 \(k\) 个,则第 \(k\) 大的一定是 \(x\)

这个证明太神了……我自己绝对想不到啊 \(qwq\)

要在考场上只能凭感觉猜了 \(qwq\)


代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring> using namespace std; int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
} const int N = 255; int n,m,k;
int a[N][N]; int mp[N][N],vis[N],con[N];
bool find(int u){
for(int v=1;v<=m;v++){
if(!mp[u][v] || vis[v]) continue;
vis[v]=1;
if(!con[v] || find(con[v])){
con[v]=u;
return true;
}
}
return false;
}
bool check(int x){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mp[i][j]=(a[i][j]<=x);
memset(con,0,sizeof(con));
int f=0;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(find(i)) f++;
}
return f>=n-k+1;
} int main()
{
n=read(); m=read(); k=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) a[i][j]=read(); int l=1000000009,r=0,mid;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
l=min(l,a[i][j]);
r=max(r,a[i][j]);
}
while(l<r){
mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l); return 0;
}

[bzoj4443] [loj#2006] [洛谷P4251] [Scoi2015]小凸玩矩阵的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【洛谷P4251】[SCOI2015]小凸玩矩阵(二分+二分图匹配)

    洛谷 题意: 给出一个\(n*m\)的矩阵\(A\).现要从中选出\(n\)个数,任意两个数不能在同一行或者同一列. 现在问选出的\(n\)个数中第\(k\)大的数的最小值是多少. 思路: 显然二分一 ...

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

    (上不了p站我要死了,侵权度娘背锅) Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸 ...

随机推荐

  1. linux 选择 ioctl 命令

    在为 ioctl 编写代码之前, 你需要选择对应命令的数字. 许多程序员的第一个本能的反 应是选择一组小数从0或1 开始, 并且从此开始向上. 但是, 有充分的理由不这样做. ioctl 命令数字应当 ...

  2. java面试代码题

    1.阅读 Shape 和 Circle 两个类的定义.在序列化一个 Circle 的对象 circle 到 文件时,下面哪个字段会被保存到文件中? 文件时,下面哪个字段会被保存到文件中? A. nam ...

  3. 2018-2-13-win10-uwp-判断设备类型

    title author date CreateTime categories win10 uwp 判断设备类型 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...

  4. 什么是特性(Attribute)?

    由面向对象思想,我们诞生了很多种面向对象编程语言,比如常用的Java,C#,这些语言中都共有类(Class)的概念,并用各自的方式去阐述.编写Class,或许方式不同,但它们都有一个共同点,即“类是对 ...

  5. SofaBoot使用Nacos进行服务注册发现

    前提 最近创业公司的项目组基于业务需要,开发一套新的微服务,考虑到选用的组件必须是主流.社区活跃.生态完善以及方便迁移到云上等因素,引入了SOFAStack全家桶.微服务开发里面,一个很重要的功能就是 ...

  6. $51nod\ 1522$ 上下序列 $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 一年过去了$gql$还是不咋会这题,,,好菜昂我的$NOIp$必将惨败了$kk$ 考虑从大到小枚举两个相同的数填哪儿,根据那个限制,十分显然的是这两个数必 ...

  7. asp.net core 实现支持多语言

    asp.net core 实现支持多语言 Intro 最近有一个外国友人通过邮件联系我,想用我的活动室预约,但是还没支持多语言,基本上都是写死的中文,所以最近想支持一下更多语言,于是有了多语言方面的一 ...

  8. 写 Java 这么久了,来编译个 JDK 玩玩儿吧

    你每天写的 Java 代码都需要 JDK 的支持,都要跑在 JVM 上,难道你就不好奇 JDK 长什么样子吗.好奇,就来编译并实现一个自己的 JDK 吧. 本次编译环境 macOS 10.12,编译的 ...

  9. Pandas 数据分析,高中体测练习

    分析体测成绩 需求: 体侧成绩转变成分数 开卷考试 excel完成可以 pandas读取excel代码中 完成 一个手输入 进一步,画图,分布,体重正常,肥胖,偏瘦比例,绘制饼图 男生跑步1000成绩 ...

  10. 日志冲突解决方案(基于gradle)

    日志冲突解决方案 前提:我使用gradle管理项目 最近在项目中需要用curator客户端操作zookeeper,在maven仓库拉取的jar包导致日志冲突,会报以下的错误: 经常会有如上图2处红色框 ...