题目链接

分析:

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

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

首先,从原点向每个学员连一条流量为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. 正则re模块

    正则表达式的特殊字符: 语法: re.match(正则语法,字符串) # re.match() 为关键字 group(1) # 取出第一个匹配 括号中的值,1位第一个括号内的值 1. 特殊字符 1 . ...

  2. Mac Mojave(10.14.1)执行Matlab的mex报错

    先装了matlab2018b,发现很频繁的crash,同时考虑到要跑的代码在>=2017a时就计算错误,于是转战matlab2016b matlab2016b安装后,执行mex -setup报错 ...

  3. base | AtomicIntegerT类

    1. 原子自增操作 type __sync_fetch_and_add (type *ptr, type value) 2. 原子比较和交换(设置)操作 type __sync_val_compare ...

  4. Nginx 提示host not found in upstream 错误解决方法

      Nginx DNS resolver配置实例,本文讲解在proxy_pass 和 upstream server 通信的时候需要手动指定 resolver,本文就给出了配置实例. nginx 通过 ...

  5. Redis托管Session

    一:redis托管session主要是为了不同域之间共享session.Asp.net提供了四种处理Session的方法 1.  InProc模式 这是ASP.NET默认的Session管理模式,在应 ...

  6. [BZOJ3011][Usaco2012 Dec]Running Away From the Barn

    题意 给出一棵以1为根节点树,求每个节点的子树中到该节点距离<=l的节点的个数 题解 方法1:倍增+差分数组 首先可以很容易的转化问题,考虑每个节点对哪些节点有贡献 即每次对于一个节点,找到其第 ...

  7. 基于AspNet Core2.0 开发框架,包含简单的个人博客Demo

    大家好,最近离职了,利用闲暇时间就捣鼓了一个基于AspNet Core开发框架,分享出来希望能给AspNet Core学者带来一些帮助,同时也能跟大家一起学习.当然了,由于我的个人技术及经验的有限,框 ...

  8. Orleans2.0正式版发布

    2.0版本支持.net core. Orleans是一个微软研究创建的用于大规模分布式计算的框架,使用者不需要学习和应用复杂的并发或其他缩放模式. 根据我几个项目的使用经验来说,Orleans虽然有应 ...

  9. ActiveMQ挂了,重启一直无法将所有实例启起来的问题

    背景 2017年3月29日  下午2-3点时分,工单模块无法访问.跟踪日志发现,ActiveMQ连接不上导致整个工单模块瘫痪: 首先判断可能是系统需要然后尝试重启工单模块,重新启动工单模块,结果:重启 ...

  10. radio按钮单选效果

    必须有name,并且是同一值,判断效果可用value值确定