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

第一问:

左边一列点代表学生,右边一列点代表导师

导师向汇点连流量为 人数限制的 边

然后从第一个学生的第一志愿往里面加边

如果当前学生的当前志愿可以满足,即目前网络流可以满流,保留这一志愿的边,然后下一个学生

否则,删除这一志愿的边,然后下一个志愿

第二问:

二分这个学生要前进多少名

假设是学生i要前进x名

把前i-x-1名的学生 在第一问中满足的志愿 的边加进去

在把学生i的边加进去

判断是否满流

注意判断满流的时候 不包括前i-x-1名学生里没有任何导师的学生

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 201
#define M 80801 int n,m; int lim[N];
int a[N][N][N];
int cnt[N][N]; int dream[N]; int tot=;
int src,decc;
int lev[N<<],cur[N<<];
int front[M<<],nxt[M<<],to[M<<],cap[M<<];
queue<int>q; int st[N]; inline void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} inline void init()
{
read(n); read(m);
decc=n+m+;
for(int i=;i<=m;++i) read(lim[i]);
int x;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
read(x);
if(x) a[i][x][++cnt[i][x]]=j;
}
for(int i=;i<=n;++i) read(dream[i]);
} inline void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; cap[tot]=;
} inline bool bfs()
{
for(int i=;i<=decc;++i) cur[i]=front[i],lev[i]=-;
while(!q.empty()) q.pop();
q.push(src);
lev[src]=;
int now,t;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=front[now];i;i=nxt[i])
{
t=to[i];
if(lev[t]==- && cap[i])
{
lev[t]=lev[now]+;
if(t==decc) return true;
q.push(t);
}
}
}
return false;
} inline int dinic(int now,int flow)
{
if(now==decc) return flow;
int rest=,delta;
for(int &i=cur[now];i;i=nxt[i])
if(cap[i] && lev[to[i]]==lev[now]+)
{
delta=dinic(to[i],min(flow-rest,cap[i]));
if(delta)
{
rest+=delta;
cap[i]-=delta; cap[i^]+=delta;
if(rest==flow) break;
}
}
if(rest!=flow) lev[now]=-;
return rest;
} void solve1()
{
for(int i=;i<=m;++i) add(n+i,decc,lim[i]);
int ok;
for(int i=;i<=n;++i)
{
add(src,i,);
for(int j=;j<=m;++j)
if(cnt[i][j])
{
for(int k=;k<=cnt[i][j];++k) add(i,n+a[i][j][k],);
if(bfs())
{
dinic(src,i);
st[i]=j;
break;
}
else
{
for(int k=,h=tot;k<=cnt[i][j];++k,h-=) cap[h]=cap[h-]=;
}
}
}
for(int i=;i<=n;++i) printf("%d ",st[i] ? st[i] : m+);
putchar('\n');
} inline bool check(int x,int goal)
{
tot=;
memset(front,,sizeof(front));
for(int i=;i<=m;++i) add(n+i,decc,lim[i]);
int ok=;
for(int i=;i<goal;++i)
{
add(src,i,);
if(!st[i])
{
ok++;
continue;
}
for(int j=;j<=cnt[i][st[i]];++j) add(i,n+a[i][st[i]][j],);
}
add(src,x,);
for(int i=;i<=dream[x];++i)
for(int j=;j<=cnt[x][i];++j) add(x,n+a[x][i][j],);
while(bfs()) ok+=dinic(src,goal);
return ok==goal;
} void solve2()
{
int l,r,mid,ans;
for(int i=;i<=n;++i)
{
if(st[i] && st[i]<=dream[i])
{
printf("0 ");
continue;
}
ans=i;
l=; r=i-;
while(l<=r)
{
mid=l+r>>;
if(check(i,i-mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d ",ans);
}
putchar('\n');
} void clear()
{
memset(st,,sizeof(st));
memset(cnt,,sizeof(cnt));
memset(front,,sizeof(front));
tot=;
} int main()
{
//freopen("mentor.in","r",stdin);
//freopen("mentor.out","w",stdout);
int T,C;
read(T); read(C);
while(T--)
{
clear();
init();
solve1();
solve2();
}
}

bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)的更多相关文章

  1. bzoj5251 [2018多省省队联测]劈配

    直接网络流模拟即可AC. 可持久化+暴力=90分, 可持久化+二分=30分, 暴力加边+二分=100分. 我也很无奈啊. Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化…… ...

  2. bzoj 5251: [2018多省省队联测]劈配

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

  3. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  4. bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...

  5. bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...

  6. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  7. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  8. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  9. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

随机推荐

  1. 【XSY1762】染色问题 网络流

    题目描述 给定一张\(n\)个点\(m\)条边的无向图.每个顶点有一个颜色,要么是黑,要么是白.我们想进行一些操作,使得最终每一条边的两个端点都是不同的颜色.每一次操作,你可以将一条边的两个端点交换颜 ...

  2. CPU监控 解题报告

    CPU监控 这种题就需要小黄鸭调试法,不行就重构,动态gdb可能会死人,一堆tag的... 维护历史最值的一个核心是历史最值tag,它的意义是从上一次这个点下放tag之后到当前时刻的这个点的tag达到 ...

  3. 对于Spring中注入对象失败的问题

    1.今天进行了一段代码,经过检查发现config配置文件没问题,注入注解也编写正确,但是RedisTemplate就是会抛出空指针异常. 进过一系列检查发现,其在用户使用该类的时候采用的是new方式创 ...

  4. highstock+websocket实现动态展现

    效果:从后台获取回测数据,在前端动态展现,和聚宽实现的回测效果相仿 大体思路:先传一个[[int,0],[int,0],[int,0],[int,0],[int,0],...]格式的死数据到前端渲染x ...

  5. 初入webform的杂七杂八

    客户端---IIS(Internet Information Services的缩写,意为互联网信息服务管理器)---.NET framework---数据库 1.Repeater控件:对应的集合有5 ...

  6. 安全测试之Top 10 漏洞的分析

    1. 问题:没有被验证的输入  测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型) 特定的模式 ...

  7. Day12--Python--生成器,生成器函数,推导式,生成器表达式

    一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...

  8. SpringCloud-初识

    说道SpringCloud,原来就去了解过,也有很大兴趣,只是当初不知道这是个什么东西.在它之前,我学习Spring,在官网肆无忌惮的逛的时候,发现了SpringBoot,那个时候就打算开始学习Spr ...

  9. macs安卓工程创建

    第一个 1.创建工程后先修改xml文件. 然后主程序中编写代码. center :如果图片比imageview大则显示中片中心部分 image大小  把view填满 匹配父控件 ,父控件多大它就多大. ...

  10. Luogu P2617 Dynamic Rankings

    带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...