题目链接

分析:

这道题看题都看了我好久...

我们可以容易想到这道题和网络流有关。

首先,从原点向每个学员连一条流量为1的边

然后,要限制每个导师的学员,在每个导师连到汇点的时候流量限制为bi

再接着,按照学员的顺序一个个动态加边,一次性加入同样优先级的边,如果有增广路就记录答案。

(第一问完美解决)

然后第二问怎么做呢?

对于一个学员,如果已经确定了排位,那我们很容易的就能验证是不是满足他的要求。

那么我们就能在[1,i-1]的区间里二分答案去检验,在[1,now-1]的残余网络里面跑即可(注意加上他自己要求范围内的边)

如何优化?

第一问:如果把整个网络都加进去的话边数太多很可能会T,而我们发现有很多边是没用的->不能提供增广路的边

那我们在跑完一个优先级发现找不到增广路的时候就把这些边全掉。

第二问:显然,二分答案每次都建立残余网络是一个很大的工程,我们可以在第一问依次处理时把残余网络图给下来,第二问直接用即可。

Code

 #include<bits/stdc++.h>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define maxn 210
#define maxm 10010
using namespace std;
int p,c,n,m,cnt,S,T;
int tmph[maxn][maxn<<],head[maxn<<],hd[maxn<<],step[maxn<<],ans[maxn],cntt[maxn];
int a[maxn][maxn],Ex[maxn],lmp[maxn][maxn],level[maxn],deal[maxn][maxn][];
struct E{
int u,v,next,pre,fl;
}e[maxm],tmpe[maxn][maxm]; inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void init()
{
memset(lmp,,sizeof(lmp));
memset(head,,sizeof(head));
cnt=;
} inline void del(int i)
{
if(e[i].next) e[e[i].next].pre=e[i].pre;
if(e[i].pre) e[e[i].pre].next=e[i].next;
if(i==head[e[i].u]) head[e[i].u]=e[i].next;
} inline void add(int u,int v,int w)
{
e[++cnt].v=v,e[cnt].u=u,e[cnt].next=head[u];
if(head[u]) e[head[u]].pre=cnt;
head[u]=cnt,e[cnt].fl=w; swap(u,v); e[++cnt].v=v,e[cnt].u=u,e[cnt].next=head[u];
if(head[u]) e[head[u]].pre=cnt;
head[u]=cnt,e[cnt].fl=;
} inline void add2(int u,int v,int w)
{
e[++cnt].v=v,e[cnt].next=head[u],head[u]=cnt,e[cnt].fl=w; swap(u,v);
e[++cnt].v=v,e[cnt].next=head[u],head[u]=cnt,e[cnt].fl=;
} bool bfs()
{
queue<int> que;
memset(step,,(T<<)+);memcpy(hd,head,(T<<)+);
que.push(S),step[S]=;
RG u,v;
while(!que.empty())
{
u=que.front(),que.pop();
for(RG i=head[u];i;i=e[i].next)
{
v=e[i].v;
if(e[i].fl&&!step[v]) step[v]=step[u]+,que.push(v);
}
}
return step[T];
} int dfs(int u,int fl)
{
if(u==T) return fl;
int tp,tt=;
for(RG &i=hd[u];i;i=e[i].next){
int v=e[i].v;
if(e[i].fl&&step[v]==step[u]+)
{
tp=dfs(e[i].v,min(e[i].fl,fl));
tt+=tp;
e[i].fl-=tp;
e[i^].fl+=tp;
if(tt==fl) return tt;
}
}
if(tt!=fl) step[u]=-;
return tt;
} void work1()
{
RG l;
rep(i,,n)
{
ans[i]=m+,add(S,i,);
rep(j,,m)
{
if(!lmp[i][j]) continue;
l=cnt;
rep(k,,lmp[i][j]) add(i,deal[i][j][k]+n,);
if(bfs()&&dfs(S,inf)) {ans[i]=j;break;}
else {rep(k,l,cnt) del(k);cnt=l;}
}
rep(j,,T) tmph[i][j]=head[j];
rep(j,,cnt) tmpe[i][j]=e[j];
cntt[i]=cnt;
}
rep(i,,n) printf("%d ",ans[i]);puts("");
} bool judge(int u,int w)
{
cnt=cntt[w-];
rep(i,,T) head[i]=tmph[w-][i];
rep(i,,cnt) e[i]=tmpe[w-][i]; add(S,u,); rep(i,,Ex[u])
{
if(!lmp[u][i]) continue;
rep(j,,lmp[u][i]) add2(u,deal[u][i][j]+n,);
} return (bfs()&&dfs(S,inf));
} void input()
{
n=read(),m=read();
S=n+m+,T=n+m+;
rep(i,,m)
{
level[i]=read();
add(i+n,T,level[i]);
}
cntt[]=cnt;
rep(i,,cnt) tmpe[][i]=e[i];
rep(i,,T) tmph[][i]=head[i];
rep(i,,n) rep(j,,m)
{
a[i][j]=read(); if(!a[i][j]) continue;
deal[i][a[i][j]][++lmp[i][a[i][j]]] = j;
}
rep(i,,n) Ex[i]=read();
} void work2()
{
RG l,r,mid,ans2;
rep(i,,n)
{
if(ans[i]<=Ex[i]){printf("0 ");continue;}
l=,r=i-,ans2=;
while(l<=r)
{
mid=l+r>>;
if(judge(i,mid)) ans2=mid,l=mid+;
else r=mid-;
}
printf("%d ",i-ans2);
}
puts("");
} int main()
{
freopen("mentor.in","r",stdin);
freopen("mentor.out","w",stdout);
int TT,C;
TT=read(),C=read();
while(TT--)
{
init();
input();
work1();
work2();
}
return ;
}

劈配 [多省省选] [BZOJ5251] [网络流]的更多相关文章

  1. 【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)

    [BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序 ...

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

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

  3. [BZOJ5251][九省联考2018]劈配(网络流)

    5251: [2018多省省队联测]劈配 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 33  Solved: 22[Submit][Status][ ...

  4. [BZOJ5251][多省联测2018]劈配

    bzoj luogu sol 从前往后依次加边,每次对一个人做完劈配后就把当前这个残余网络存下来.这样第二问就可以二分排在第几名然后check一下在对应排名的残余网络上还能不能再增广. 给网络流开结构 ...

  5. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

  6. 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)

    洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...

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

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

  8. BZOJ5251:[九省联考2018]劈配——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 https://loj.ac/problem/2477  <-可以看数据 https: ...

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

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

随机推荐

  1. jsp和

  2. 利用SVD-推荐未尝过的菜肴

    推荐未尝过的菜肴-基于物品相似度的推荐 推荐系统的工作过程:给定一个用户,系统会为此用户返回N个最好的推荐菜 1. 寻找用户没有评级的菜肴,即在用户-物品矩阵中的0值 2. 在用户没有评级的所有物品中 ...

  3. UIDebuggingInformationOverlay 调试

    https://archimboldi.me/posts/%E7%BF%BB%E8%AF%91-uidebugginginformationoverlay.html http://ryanipete. ...

  4. Senparc.Weixin微信开发(3) 自定义菜单与获取用户组

    自定义菜单 代码参考:http://www.cnblogs.com/szw/p/3750517.html 还可以使用他们官网的自定义:https://neuchar.senparc.com/User/ ...

  5. Beyond-Compare 4 -linux 破解

    key失效了可以去https://www.serials.be/serial/Beyond_Compare_4_Linux_68803632.html生成 Crack-Beyond-Compare-l ...

  6. WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Exception in thread "main" java.io.IOException: No FileSystem for sc F

    1.执行脚本程序报如下所示的错误: [hadoop@slaver1 script_hadoop]$ hadoop jar web_click_mr_hive.jar com.bie.hive.mr.C ...

  7. [转] Javascript中理解发布--订阅模式

    发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...

  8. POJ 1273 Drainage Ditches【最大流模版】

    题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条有向水渠,给出这n条水渠所连接的点和所能流过的最大流量,求从源点到汇点能流过的最大流量 Dinic #include<iost ...

  9. NPOI导出Excel帮助类

    工具类 using System; using System.Collections.Generic; using System.Data; using System.IO; using System ...

  10. python sqlite3查看数据库所有表(table)

    #coding:utf-8 import sqlite3 ''' sqlite3存在系统表sqlite_master,结构如下: sqlite_master( type TEXT,      #类型: ...