博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4443: 小凸玩矩阵【二分图】
阅读量:4322 次
发布时间:2019-06-06

本文共 1733 字,大约阅读时间需要 5 分钟。

先看题目,从数列中选第K小,很容易想到二分或者单调队列,但这里单调队列显得不是那么合适。而任意两个数不在一行一列,这符合二分图的定义,所以思路就很明了了,找出所有的值然后去二分找答案。

#include 
#include
#include
#include
#define oo 0x7f7f7f7f#define get(x) scanf( "%d", &x )#define put(x) printf( "%d", x )#define cln(x) memset( x, 0, sizeof(x) )using namespace std;const int R = 255;int f[R];int p[R];int sq[R][R];int head[R];int to[R<<1];int next[R<<1];int n, m, k, ans, tot;void add( int x, int y ){ tot++; to[tot] = y; next[tot] = head[x]; head[x] = tot;}int DFS( int x, int t ){ for ( int i = head[x]; i != -1; i = next[i] ) { if ( p[to[i]] != t ) { int y = to[i]; p[y] = t; if ( f[y] == 0 || DFS( f[y], t ) ) { f[y] = x; return 1; } } } return 0;}int solve( int l, int r ){ if ( l > r ) return l; int mid = ( l + r ) >> 1; ans = 0; tot = 0; for ( int i = 1; i <= n; i++ ) head[i] = -1; for ( int i = 1; i <= m; i++ ) p[i] = f[i] = 0; for ( int i = 1; i <= n; i++ ) for ( int j = 1; j <= m; j++ ) if ( sq[i][j] <= mid ) add( i, j ); for ( int i = 1; i <= n; i++ ) ans += DFS( i, i ); if ( ans >= n - k + 1 ) return solve(l, mid - 1); else return solve( mid + 1, r );}int main(){ get(n), get(m), get(k); for ( int i = 1; i <= n; i++ ) for ( int j = 1; j <= m; j++ ) { get(sq[i][j]); ans = max( ans, sq[i][j] ); } put( solve( 1, ans ) ); return 0;}

↑除了MLE所有错误类型都被我弄出来了,真是伤不起Orz

转载于:https://www.cnblogs.com/GuanHuaEdison/p/6920543.html

你可能感兴趣的文章
软工个人项目之词频统计
查看>>
Alpha 冲刺 (7/10)
查看>>
Bmob基础
查看>>
HashMap和HashTable,HashMap中key和value的原理 - 跳刀的兔子 - 博客园
查看>>
Linux自定义分隔符IFS引发的文本处理问题
查看>>
小米商城-题头4
查看>>
permu 莫队 总结
查看>>
Android中Handler原理
查看>>
x/nfu-用gdb查看内存
查看>>
移植wpa_supplicant2.5及界面配置wifi(原创)
查看>>
JAVA编码(52)—— API接口安全性设计
查看>>
c:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"Temp
查看>>
android EditText自动弹出和自动关闭软键盘
查看>>
吉特日化MES-工业生产盲区
查看>>
Codeforces 517 #B
查看>>
实验四
查看>>
Scramble String
查看>>
php之接口概念
查看>>
01、计算机原理结构,及冯诺依曼体系结构
查看>>
Python 列表基本操作
查看>>