洛谷P4382 劈配
不知道这个Zayid是谁...
题意:
有n个人,m个导师。每个导师能接纳bi个人,每个人对于这m个导师都有一个志愿档次。
优先满足靠前的人,问到最后每个人匹配的导师是他的第几志愿。
每个人又有一个限制si,问至少前进多少名才能被志愿档次不大于si的导师录取。
解:
首先发现,每个志愿档次只能填一个人的时候,可以直接贪心。否则在同一志愿档次内选择不同的导师会对后面有影响。
这时我们就可以利用网络流。
一个流量代表一个的归属,动态加边。
对于每个人枚举志愿档次,添加流向导师的边。然后看是否有流量。
如果有流量那么他就归于该志愿档次。
第二问,答案可以二分。
很简朴的想法是对于每个二分出来的值,重新建图来一遍。这样复杂度就是Tnlogn * nm,显然不行。
发现每次重新建图的时候我们进行了很多一模一样的操作。于是考虑把前k个人的网络流状态保存下来,之后直接调用。
但是太麻烦了...我们又发现一种很巧妙的方法:判断在前k个人加完之后是否可行,其实是看哪些导师还可以接纳人。于是我们从汇点出发,反向DFS,能够得到每次从哪些导师出发有增广路,就是哪些导师还能接纳。
然后二分的时候直接O(m)判定。
这样我们发现有90分,超时一个点。
回想第一问网络流的时候,如果一个志愿档次没有流量,那么这些加的边就没有用,不妨删了。
然后就A了...
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm> const int N = , INF = 0x3f3f3f3f; int b[N], C, n, m, a[N][N], s[N], mat[N];
std::vector<int> topo[N][N]; namespace fl { struct Edge {
int nex, v, c;
}edge[]; int top = ; int d[N << ], e[N << ], E[N << ], TOP;
bool vis[N][N << ];
std::queue<int> Q; inline void add(int x, int y, int z) {
top++;
edge[top].v = y;
edge[top].c = z;
edge[top].nex = e[x];
e[x] = top; top++;
edge[top].v = x;
edge[top].c = ;
edge[top].nex = e[y];
e[y] = top;
return;
} inline bool BFS(int s, int t) {
memset(d, , sizeof(d));
d[s] = ;
Q.push(s);
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i].c || d[y]) {
continue;
}
d[y] = d[x] + ;
Q.push(y);
}
}
return d[t];
} int DFS(int x, int t, int maxF) {
if(x == t) {
return maxF;
}
int Ans = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i].c || d[x] + != d[y]) {
continue;
}
int temp = DFS(y, t, std::min(edge[i].c, maxF - Ans));
if(!temp) {
d[y] = INF;
}
Ans += temp;
edge[i].c -= temp;
edge[i ^ ].c += temp;
if(Ans == maxF) {
break;
}
}
return Ans;
} inline int dinic(int s, int t) {
int Ans = ;
while(BFS(s, t)) {
Ans += DFS(s, t, INF);
}
return Ans;
} void DFS(int x, int k) {
vis[k][x] = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i ^ ].c || vis[k][y]) {
continue;
}
DFS(y, k);
}
return;
} inline bool check(int x, int mid) {
for(int k = ; k <= s[x]; k++) {
for(int jj = topo[x][k].size() - ; jj >= ; jj--) {
int j = topo[x][k][jj];
if(vis[x - mid - ][j + n]) {
return ;
}
}
}
return ;
} inline void solve() {
memset(vis[], -, sizeof(vis[]));
int S = n + m + , T = n + m + ;
for(int i = ; i <= m; i++) {
add(n + i, T, b[i]);
}
for(int i = ; i <= n; i++) {
add(S, i, );
mat[i] = ;
for(int k = ; k <= m; k++) {
TOP = top;
E[i] = e[i];
for(int jj = topo[i][k].size() - ; jj >= ; jj--) {
int j = topo[i][k][jj];
E[n + j] = e[n + j];
add(i, n + j, );
}
int temp = dinic(S, T);
if(temp) {
mat[i] = k;
break;
}
else {
e[i] = E[i];
for(int jj = topo[i][k].size() - ; jj >= ; jj--) {
int j = topo[i][k][jj];
e[n + j] = E[n + j];
}
top = TOP;
}
}
if(!mat[i]) {
mat[i] = m + ;
}
DFS(T, i);
}
for(int i = ; i <= n; i++) {
printf("%d ", mat[i]);
}
puts("");
// first OVER for(int i = ; i <= n; i++) {
if(mat[i] <= s[i]) {
printf("0 ");
continue;
}
int l = , r = i;
while(l < r) {
int mid = (l + r) >> ;
if(check(i, mid)) {
r = mid;
}
else {
l = mid + ;
}
}
printf("%d ", r);
}
puts("");
return;
} inline void clear() {
memset(e, , sizeof(e));
top = ;
memset(vis, , sizeof(vis));
return;
}
} inline void solve() {
scanf("%d%d", &n, &m);
for(int i = ; i <= m; i++) {
scanf("%d", &b[i]);
}
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
scanf("%d", &a[i][j]);
if(a[i][j]) {
topo[i][a[i][j]].push_back(j);
}
}
}
for(int i = ; i <= n; i++) {
scanf("%d", &s[i]);
}
// read over fl::solve();
return;
} inline void clear() {
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
topo[i][j].clear();
}
}
fl::clear();
return;
} int main() { int T;
scanf("%d%d", &T, &C);
while(T--) {
solve();
if(T) {
clear();
}
}
return ;
}
AC代码
我发现D2T1都好毒瘤...屠龙勇士也是的。
洛谷P4382 劈配的更多相关文章
- 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)
洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...
- 洛谷P5289 皮配
解:观察一波部分分. 首先小数据直接暴力4n,然后考虑背包.设f[i][a][b][c]表示前i个学校中前三位导师分别有多少人,第四位导师可以直接推出来. 然后暴力枚举每一个人放在哪进行背包. 进一步 ...
- 【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)
[BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序 ...
- [洛谷P3643] [APIO2016]划艇
洛谷题目链接:[APIO2016]划艇 题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 \(N\) 个划艇学校,编号依次为 \(1\) 到 \(N\).每个学校都拥有若干艘 ...
- 洛谷P1991 无线通讯网
P1991 无线通讯网 170通过 539提交 题目提供者洛谷OnlineJudge 标签图论 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 怎么又炸了 为啥一直40!求解! UKE:inv ...
- BZOJ5251:[九省联考2018]劈配——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5251 https://loj.ac/problem/2477 <-可以看数据 https: ...
- COCI2017-2018#3 Dojave || 洛谷P4443
题目传送门............................................................................................... ...
- 【洛谷4933】大师(DP)
题目: 洛谷4933 分析: (自己瞎yy的DP方程竟然1A了,写篇博客庆祝一下) (以及特斯拉电塔是向Red Alert致敬吗233) 这里只讨论公差不小于\(0\)的情况,小于\(0\)的情况进行 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
随机推荐
- Python20-Day04
##########迭代器.生成器和面向过程编程########## 一.迭代器 迭代器是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值: l = [1,2,3] cou ...
- maven实战读书笔记(三)
maven将一系列的步骤都封装为一系列的插件,运行命令后一系列的插件运行
- Thunder——Final发布
视频: https://www.bilibili.com/video/av17008792/ 视频播放截图及简要文字介绍: http://www.cnblogs.com/lick468/p/799 ...
- 2-First scrum meeting-20151201
前言 因为编译和数据库的影响,这学期的担子差点抗不起来……所以在老师的同情之下我们的第二阶段从今天开始正式开工.因为scrum meeting要求更新,所以配合其他作业,完成功能可能细化到模块部分. ...
- stateful openflow------整理openstate原理以及具体应用
openstate基本思想就是控制器下放一部分功能,交换机不再是简单的dumb,而是保留一些简单的wise. 论文中以端口锁定为例,提出了米粒型状态机在交换机内部的应用从而可以大大减少交换机和控制器之 ...
- [不明所以]android 5.0 couldn't find "libmsc.so"
用5.0 mi2调试的时候 search那边不行, 出现...couldn't find "libmsc.so" 我这边情况的解决方法是 在armeabi的libmsc.so复制一 ...
- gdb调试器学习链接
首先要带 -g 选项用gcc编译 常用指令:http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html#gdb 带main的命令行参 ...
- 电梯调度系统(界面由C图形库编绘)
电梯调度系统编程 1.编程题目 电梯调度. 2.结对编程组员 黄冠译,刘畅. 3.编程语言 C语言图形库. 4.题目要求: 5.代码运行及结果调试: ① 运行界面为C++图形库支持,开始运行的初始界面 ...
- thinkphp学习3-模板与视图
1.模板赋值 如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值. $this->assign('na ...
- 搭建企业级Docker Registry -- Harbor
Harbor 是一个企业级的 Docker Registry,可以实现 images 的私有存储和日志统计权限控制等功能,并支持创建多项目(Harbor 提出的概念),基于官方 Registry V2 ...