BZOJ4443:[SCO2015]小凸玩矩阵

  题目大意:给一个N*M的矩阵,选出N个数,使得每行没列只选一个数,求第K大的数的最小值是多少?

  二分答案,第k大的数<=x,则有N-k+1个数<=k,用二分图判定。

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int a[255][255];
void init(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            scanf("%d",&a[i][j]);
}
struct node{
    int to[100010],next[100010],h[300],tot;
    int g[500],tim,vis[500];
    void init(){
        tot=0;
        memset(h,0,sizeof(h));
        memset(g,0,sizeof(g));
    }
    void add(int x,int y){
        tot++;to[tot]=y;next[tot]=h[x];h[x]=tot;
    }
    void build(int x){
        init();
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                if(a[i][j]<=x)add(i,j);
    }
    int find(int x){
        for(int i=h[x];i;i=next[i]){
            int v=to[i];
            if(vis[v]==tim)continue;
            vis[v]=tim;
            if(!g[v]||find(g[v])){
                g[v]=x;
                return 1;
            }
        }
        return 0;
    }
    int solve(){
        int tmp=0;
        for(int i=1;i<=n;++i){
            ++tim;
            if(find(i))tmp++;
        }
        return tmp;
    }
}A;
bool jud(int x){
    A.build(x);
    int ans=A.solve();
    return ans>=n-k+1;
}
void work(){
    int L=1,R=1e9;
    while(L<R){
        int mid=(L+R)>>1;
        if(jud(mid))R=mid;
        else L=mid+1;
    }
    printf("%d\n",L);
}
int main(){
    init();
    work();
    return 0;
}

时间: 2024-08-06 13:37:23

BZOJ4443:[SCO2015]小凸玩矩阵的相关文章

bzoj4443: [Scoi2015]小凸玩矩阵

太久没搞网络流,又被坑了一发死循环..(这次是对cur[]初始化没对.以后直接for S到T不就好了嘛!) 先看数据量.诶,才250,肯定n三方.搜索不行,dp不行,贪心不行,二分图网络流?恩,有可能,先放一边去. 然而正解就是二分+二分图匹配. 二分答案,二分图匹配看是否存在大等n-k+1个匹配. 基本上每当题目中有限制不能同行不能同列的时候都是二分图左边为行,右边为列来匹配的.(我怎么就是不长记性呢,又被坑了 1 #include<bits/stdc++.h> 2 using namesp

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

[BZOJ4443][Scoi2015]小凸玩矩阵 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=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<

[Scoi2015]小凸玩矩阵

bzoj 4443: [Scoi2015]小凸玩矩阵 http://www.lydsy.com/JudgeOnline/problem.php?id=4443 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少. Input 第一行给出三个整数N,M,K 接下来N

LibreOJ #2006. 「SCOI2015」小凸玩矩阵

二次联通门 : LibreOJ #2006. 「SCOI2015」小凸玩矩阵 /* LibreOJ #2006. 「SCOI2015」小凸玩矩阵 本来以为是道数据结构题 后来想了想发现不可做 就考虑二分dp判断 推方程推不出来 就考虑用网络流判断了 二分出一个数 将小于这个数的位置的点编号 每行的可行点与下一行可行的点连边 后一边最大流判断可选出的数的个数是否符合要求即可 */ #include <cstdio> #include <iostream> #include <q

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

#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 N NN 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 N NN 个数中第 K KK 大的数字的最小值是多少. 输入格式 第一行给出三个整数

4443: [Scoi2015]小凸玩矩阵

4443: [Scoi2015]小凸玩矩阵 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=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<=K&l

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

题目描述 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少. 输入 第一行给出三个整数N,M,K 接下来N行,每行M个数字,用来描述这个矩阵 输出 如题 样例输入 3 4 2 1 5 6 6 8 3 4 3 6 8 6 3 样例输出 3 题解 二分+二分图最大匹配 最(第k)大值最小,很容易想到二分答案. 二分一个mid,若满足条件,一定满足:可以选出n-k+1个不

bzoj 4443: [Scoi2015]小凸玩矩阵

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 149  Solved: 81[Submit][Status][Discuss] Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少. Input 第一行给出三个整数N,M,K 接下来N行,每行M个数字,用来描述这个矩阵 Output 如题 Samp

【bzoj4443】[Scoi2015]小凸玩矩阵

第K大也就是第n-K+1小,所以就可以的二分答案了 (江哥讲过一道类似题) 二分答案找出比当前答案小的数的位置的坐标,判断一下是否可以选出满足不在同一行同一列的n-K+1个数,然后就可以跑匈牙利了,对于一个坐标(x,y)如果满足a[x][y]≤a[x][y]当前答案,就把第x行向第y列连边,然后跑匈牙利判断最大匹配是否大于n-K+1 #include<algorithm> #include<iostream> #include<cstdlib> #include<