bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)
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多省省队联测]劈配(网络流 + 二分)的更多相关文章
- bzoj5251 [2018多省省队联测]劈配
直接网络流模拟即可AC. 可持久化+暴力=90分, 可持久化+二分=30分, 暴力加边+二分=100分. 我也很无奈啊. Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化…… ...
- bzoj 5251: [2018多省省队联测]劈配
Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayi ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...
- bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋
https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
随机推荐
- FAQ常见问题解答---搭建hubot
1. [root@test160 ~]# npm install -g n npm ERR! Error: CERT_UNTRUSTED 证书不受信任的 解决办法: npm config set st ...
- 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂
题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...
- windows 系统错误码总结
windows 错误码大全: 操作成功完成. 功能错误. 系统找不到指定的文件. 系统找不到指定的路径. 系统无法打开文件. 拒绝访问. 句柄无效. 存储控制块被损坏. 存储空间不足,无法处理此命令. ...
- LGP2801 教主的魔法
题目链接 : P2801 教主的魔法 这是第一次A分块的题 就是模板题了 每个块内排序 每个整块仅需维护整块的修改量 询问操作: 对于边缘块 直接暴力找在[l, r]内 且比给定值大的有几个 对于整块 ...
- 【BZOJ5318】[JSOI2018]扫地机器人(动态规划)
[BZOJ5318][JSOI2018]扫地机器人(动态规划) 题面 BZOJ 洛谷 题解 神仙题.不会.... 先考虑如果一个点走向了其下方的点,那么其右侧的点因为要被访问到,所以必定只能从其右上方 ...
- 低电平ViL
低电平 编辑 低电平(Vil)指的是保证逻辑门的输入为低电平时所允许的最大输入低电平,当输入电平低于Vil时,则认为输入电平为低电平. 中文名 低电平 外文名 Vil 主要应用 测量电缆和保护连接 ...
- Git错误汇总
Git提示rejected To github.com:zhuxiaoxi/Web-Demo.git ! [rejected] master -> master (fetch first) er ...
- Linux命令模拟Http的get或post请求
Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求. get请求: 1.使用curl命令: cur ...
- [SDOI2011]计算器(exgcd&BSGS)
k=1:裸的快速幂k=2:xy=z+kp,直接exgcd,这个可以不用解释了,不懂的同学可以看代码 k=3:裸的BSGS 重点是k=3(BSGS学习)ax=b(mod p)求解这个同余方程只能求gcd ...
- 第二篇:用Android Studio编写Hello World
将Android Studio的环境搭建好后,第一个写Hello World测试程序.Android Studio v3.2.1. 一.新建工程 点击Start a new Android Studi ...