[BZOJ5251][多省联测2018]劈配
sol
从前往后依次加边,每次对一个人做完劈配后就把当前这个残余网络存下来。这样第二问就可以二分排在第几名然后check一下在对应排名的残余网络上还能不能再增广。
给网络流开结构体直接赋值美滋滋。
然后这样就可以根据评测机的实际情况获得\(60-80\)不等的好成绩。
一个显而易见的优化就是:对于一个人,如果他已经确认了选择某个志愿,那么不仅更靠后的志愿是没用的,更靠前的志愿也是没用的。
所以对于一个人我们只需要保留他选的那个志愿对应的那至多\(C\)条边,这样边数和时间复杂度都降下来了。
按照上面的思路就可以成功通过本题了。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int inf = 1e9;
const int N = 405;
int n,m,S,T,a[N][N],b[N],id[N],s[N],ans[N];
queue<int>Q;
struct edge{int to,nxt,w;};
struct net{
edge a[N*30];
int head[N],cnt,dep[N],cur[N];
inline void init(){memset(head,0,sizeof(head));cnt=1;}
inline void link(int u,int v,int w)
{
a[++cnt]=(edge){v,head[u],w};head[u]=cnt;
a[++cnt]=(edge){u,head[v],0};head[v]=cnt;
}
inline bool bfs()
{
memset(dep,0,sizeof(dep));
dep[S]=1;Q.push(S);
while (!Q.empty())
{
int u=Q.front();Q.pop();
for (int e=head[u];e;e=a[e].nxt)
if (a[e].w&&!dep[a[e].to])
dep[a[e].to]=dep[u]+1,Q.push(a[e].to);
}
return dep[T];
}
int dfs(int u,int f)
{
if (u==T) return f;
for (int &e=cur[u];e;e=a[e].nxt)
if (a[e].w&&dep[a[e].to]==dep[u]+1)
{
int tmp=dfs(a[e].to,min(a[e].w,f));
if (tmp) {a[e].w-=tmp;a[e^1].w+=tmp;return tmp;}
}
return 0;
}
inline int dinic()
{
int res=0;
while (bfs())
{
for (int i=1;i<=T;++i) cur[i]=head[i];
while (int tmp=dfs(S,1)) res+=tmp;
}
return res;
}
}G[N>>1];
inline bool cmp(int i,int j){return b[i]<b[j];}
int main()
{
freopen("mentor.in","r",stdin);
freopen("mentor.out","w",stdout);
int Case=gi();gi();
while (Case--)
{
n=gi();m=gi();S=n+m+1;T=S+1;
G[0].init();
for (int i=1,x;i<=m;++i) x=gi(),G[0].link(i+n,T,x);
for (int i=1,j,res;i<=n;++i)
{
for (j=1;j<=m;++j) a[i][j]=b[j]=gi(),id[j]=j;
sort(id+1,id+m+1,cmp);
j=1;while (j<=m&&!b[id[j]]) ++j;
for (res=1;res<=m;++res)
{
G[i]=G[i-1];G[i].link(S,i,1);
while (j<=m&&b[id[j]]==res) G[i].link(i,id[j]+n,1),++j;
if (G[i].dinic()) break;
}
printf("%d ",ans[i]=res);
}
puts("");
for (int i=1;i<=n;++i)
{
s[i]=gi();
if (ans[i]<=s[i]) {printf("0 ");continue;}
int l=0,r=i-1,res=0;
while (l<=r)
{
int mid=l+r>>1;
net tmp=G[mid];tmp.link(S,i,1);
for (int j=1;j<=m;++j) if (a[i][j]&&a[i][j]<=s[i]) tmp.link(i,j+n,1);
if (tmp.dinic()) res=l=mid+1;else r=mid-1;
}
printf("%d ",i-res);
}
puts("");
}
return 0;
}
[BZOJ5251][多省联测2018]劈配的更多相关文章
- [BZOJ5251][九省联考2018]劈配(网络流)
5251: [2018多省省队联测]劈配 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 33 Solved: 22[Submit][Status][ ...
- BZOJ5251 八省联考2018劈配(网络流)
劈配,匹配,网络流.那么考虑怎么跑网络流. 先看第一问.首先套路的建出超源超汇.不用想也知道导师向汇连容量为战队人数上限的边.特别地,给出局也建一个点,向汇连容量inf的边(似乎没有必要).对于一个新 ...
- BZOJ5251:[九省联考2018]劈配——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5251 https://loj.ac/problem/2477 <-可以看数据 https: ...
- [八省联考2018] 劈配 mentor
Description 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. Input 轻车熟路的Zay ...
- BZOJ.5251.[八省联考2018]劈配mentor(最大流)
BZOJ 洛谷 对于每个人,每次枚举一个志愿看是否能增广即可. 对于第二问,可以保留第一问中\(n\)次增广前后的\(n\)张图,二分,在对应图上看是否能增广即可. 貌似匈牙利的某种写法比网络流优多了 ...
- 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)
洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...
- P4382 [八省联考2018]劈配
题目链接 题意分析 受到了\(olinr\ \ julao\)的影响 写了匈牙利算法 首先 我们对于每一个人 从高到低枚举志愿 如果当前志愿的老师有剩余的话 那么我们就选 否则的话 我们看看谁的那个志 ...
- luogu P4382 [九省联考2018]劈配
luogu 我记得我第一次做这道题的时候屁都不会qwq 先考虑第一问,暴力是依次枚举每个人,然后从高到低枚举志愿,枚举导师,能选就选.但是可以发现前面的人选的导师可能会导致后面的人本来可以选到这个志愿 ...
- 【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)
[BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序 ...
随机推荐
- sudoers文件设置sudo命令无密码(root密码)登录
参考博客:http://xvshell.iteye.com/blog/1838093 1. 当用户执行sudo时,Linux系统会去寻找/etc/sudoers文件,并且这是主动的,判断用户是否有执行 ...
- css小技巧1
资料 1. 文本省略 单行省略: white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 多行文本省略: 只兼容webkit内核,不属 ...
- 每天一个linux命令(6/18):lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以,lsof的功 ...
- Linux的Cache Memory(缓存内存)机制
转:https://blog.csdn.net/kaikai_sk/article/details/79177036 PS:为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与W ...
- samba Doc
Samba-HOWTO-Collection中文翻译版(2.20) 2013年08月23日 ⁄ 综合 ⁄ 共 19460字 ⁄ 字号 小 中 大 ⁄ 评论关闭 Samba计划文档 (初稿) Samba ...
- c# 类的序列化,以及嵌套问题
简单的序列化,网上很多,但是突然想到一个问题,如果一个类里用到了另一个,那么怎么办,今天试了试,只需要加上序列号标签就可以了 using System.Collections; using Syste ...
- python中的元类metaclass
本文是一个转载的,因为原文写的太好了,所以直接copy过来吧. 原文请看:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上 很热的帖子.提问 ...
- 【bzoj5085】最大(二分+乱搞)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5085 这道题我们可以先二分答案,然后转化为判定是否有四角权值>=mid的矩形. ...
- MapReduce-计数器
计数器 计数器是收集作业统计信息的有效手段之一,用于质量控制或应用级统计.计数器还可辅助诊断系统故障.根据计数器值来记录某一特定事件的发生比分析一堆日志文件容易得多.内置计数器Hadoop为每个作业维 ...
- 简介web服务器的工作原理
一 什么是web服务器,应用服务器和web容器? 对于web服务器与应用服务器:“在过去它们是有区别的,但是这两个不同的分类慢慢地合并了,而如今在大多在情况下和使用中可以把它们看成一个整体.” 但是当 ...