https://www.lydsy.com/JudgeOnline/problem.php?id=5251

https://loj.ac/problem/2477  <-可以看数据

https://www.luogu.org/problemnew/show/P4382

题面太长,请自行读完之后再看本题。

考试的时候让我伤心的一道题,分明想的就是正解结果sb般第二问没二分丢了15分。

如果b=1就是一个显然的匈牙利匹配了。

考虑b!=1也只不过就是让一个导师可以多匹配几个人而已,额外记录这个导师是否还能匹配人即可。

那么对于第一问显而易见匈牙利算法即可完成,复杂度最差就是每个人的其中一个志愿被我们遍历一遍,于是一次匈牙利是O(n*c),总共O(n^2*c)。

第二问二分答案后对这个点再匈牙利一次,实际就是清出答案和现在这个点之间的点的所有答案,而且我们已经知道了它之前的所有人的志愿和导师选择,因此大可以直接复制下来而不用重新跑一遍。

因此是O(n^2*logn*c)轻松跑过。

(至于为什么debug这么久纯粹是因为我傻,没有考虑匈牙利算法可以增广的不只有它前面的点,还可以有后面的点。)

总结:一道好题,洛谷评分虚高,实际为省选/NOI-,但是为了纪念我debug的时间之长,于是评了个NOI。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=210;
inline int read(){int X=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9')X=(X<<1)+(X<<3)+ch-'0',ch=getchar();return X*w;
}
int n,m,b[N],bb[N],s[N];
int ds[N],zy[N],dds[N],zzy[N];
int a[N][N][11],len[N][N];
bool vis[N];
bool dfs(int k,int w){for(int j=1;j<=len[k][w];j++){int u=a[k][w][j];if(vis[u])continue;vis[u]=1;if(b[u]){ds[k]=u;zy[k]=w;b[u]--;return 1;}else{for(int l=1;l<=n;l++){//这里debug 3h+才发现。 if(l==k)continue;if(ds[l]==u){if(dfs(l,zy[l])){ds[k]=u;zy[k]=w;return 1;}}}}}return 0;
}
inline void copy(int k){for(int i=1;i<=m;i++)b[i]=bb[i];for(int i=1;i<=k;i++){ds[i]=dds[i];zy[i]=zzy[i];b[ds[i]]--;}for(int i=k+1;i<=n;i++)ds[i]=-1;return;
}
inline void work2(){for(int i=1;i<=n;i++){if(zzy[i]<=s[i])printf("0 ");else{int l=1,r=i-1,ans=0;while(l<=r){int mid=(l+r)>>1;bool ok=0;copy(mid-1);memset(vis,0,sizeof(vis));for(int j=1;j<=s[i];j++){if(dfs(i,j)){ans=mid;l=mid+1;ok=1;break;}}if(!ok)r=mid-1;}printf("%d ",i-ans);}}puts("");
}
inline void work1(){for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));for(int j=1;j<=m;j++){if(!len[i][j])continue;if(dfs(i,j))break;}}for(int i=1;i<=n;i++){zzy[i]=zy[i];dds[i]=ds[i];printf("%d ",zy[i]);}puts("");
}
inline void init(){n=read(),m=read();memset(len,0,sizeof(len));for(int i=1;i<=m;i++)bb[i]=b[i]=read();for(int i=1;i<=n;i++){zy[i]=m+1;ds[i]=-1;for(int j=1;j<=m;j++){int k=read();if(k)a[i][k][++len[i][k]]=j;}}for(int i=1;i<=n;i++)s[i]=read();
}
int main(){int t=read(),c=read();while(t--){init();work1();work2();}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8764623.html

BZOJ5251:[九省联考2018]劈配——题解相关推荐

  1. BZOJ5251 八省联考2018劈配(网络流)

    劈配,匹配,网络流.那么考虑怎么跑网络流. 先看第一问.首先套路的建出超源超汇.不用想也知道导师向汇连容量为战队人数上限的边.特别地,给出局也建一个点,向汇连容量inf的边(似乎没有必要).对于一个新 ...

  2. [八省联考2018]劈配

    [八省联考2018]劈配 并不难的一道题,甚至比一双木棋还容易一些 关键点就是一个:怎么处理"最优结果",即总体字典序最小 显然要反悔.匹配问题反悔套路就多了 法一: 变形匈牙利算 ...

  3. [八省联考2018]劈配 (匈牙利)

    description 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 轻车熟路的 Zayid 顺利 ...

  4. 洛谷 4382 [八省联考2018]劈配——二分图匹配

    题目:https://www.luogu.org/problemnew/show/P4382 原本想着网络流.不过看了一番题解发现二分图匹配也行. 原本想着第一问也二分,不过看了一番题解发现一档一档地 ...

  5. 九省联考2018总结

    前言 我作为一名ZJOI2018day1凉凉选手,为获得更多的省选体验,去上海参加了九省联考2018,当然,是属于外省选手参加的(所以实际并测的时候出现了一些问题也得不到解决),做完两天的题,深有感触 ...

  6. 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

    「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可 ...

  7. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  8. 「九省联考 2018」一双木棋

    「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...

  9. [BZOJ5249][九省联考2018]IIIDX(线段树)

    5249: [2018多省省队联测]IIIDX Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 32  Solved: 17 [Submit][Sta ...

最新文章

  1. 对信号与系统课程的意见与建议
  2. python代码案例详解-新手必学Python爬虫之Scrapy框架案例详解
  3. oracle增量合并存储过程,怎么将视图与存储过程里的逻辑合并
  4. 模拟退火算法通俗讲解
  5. linux中vim常用命令总结
  6. python 创建以列表为元素的列表
  7. 购进不需要安装的生产设备_静压砖机设备生产环境的选择及安装前期事项分析...
  8. 信用逾期3年是不是一定会坐牢?
  9. 小度回应天猫精灵:不要因为我们拿了第一就黑我们
  10. 初次使用Atlas JavaScript (Part 3 - 实现自己的应用)
  11. mysql索引下推原理_mysql的索引下推理解和实践
  12. 危险无处不在 Html标签带来的安全隐患
  13. 转接口IC ADV7280/ADV7280-M:CVBS转MIPI芯片 10位、4倍过采样标清电视视频解码器,支持去隔行
  14. 计算机网络计算题:时延
  15. UI/UE设计学习路线图(超详细)
  16. Coremail论客副总裁:从传统走向自主可控,金融行业邮件系统的转型升级
  17. C语言:求n的阶乘和n的阶乘和
  18. 任正非霸气回应:没有谷歌,华为也能成为世界第一!
  19. 极智Coding | C 和 C++ 读存 bin 文件方法
  20. 不是所有产品都适合做亚马逊CPC广告

热门文章

  1. python浅拷贝深拷贝
  2. 《你必须知道的.NET》,评价和推荐
  3. scala初学之函数定义、流程控制、异常处理入门
  4. 选择日期保存报错Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String......
  5. Golang——error处理及panic、recover使用的正确姿势
  6. s丅7318是啥芯片_透彻解析LED驱动芯片HT1632C指令集与驱动编程
  7. 你不懂API接口是什么?怎么和程序员做朋友
  8. 互联网前景如何,还值得进入嘛?
  9. 互联网晚报 | 9月16日 星期四 | 网易云音乐发布“村民证”;阿里社区电商品牌升级为“淘菜菜”;高德打车上线“实景上车点”...
  10. ​​2021快手母婴行业数据价值报告