LNOI2018 劈配
主要思路为连反向边。
对于本题,贪心策略,依次决定每个人的最优解
但因为每人达到的最优解可能有多种方式,如果每个都尝试就会超时,所以只能先采取其中一种
并将这个方案连反向边,其它方案连正向边
这样对于之后的人决策,可以看哪些导师能够走到汇点
就是反向建图后,从汇点BFS判断能到达哪些导师,再判断哪个更优。
例如:对于这个例子

建图为

先考虑选手1。 1,2号导师都能到达汇点,并且选择1,2号导师对于目前来说都是最优解(现在无法确定哪个对于之后更优),所以先选择1。
图变为

(红色为反向边)
考虑选手2。 1,2号导师都能到达汇点,1更优,所以选择1。这里走了反向边后走到了2导师,相当于让1选手选择2导师。
这个思想类似最大流的增广路算法(都是利用反向边来调整之前错误的决策)。
这道题有“前 i 名的录取结果最优,当且仅当在前 i − 1 名的录取结果最优的情况下:第 i 名 被其理论可能的最高志愿录取”这句话,这个属于贪心。这有这样,才能使用本题思想。
#include <stdio.h>
int fr[410],ne[5010],lad[410];
int v[5010],w[5010],bs=0;
int dl[410],la[410],n,m,sy[210];
bool bk[410],xz[210][210];
int zy[210][210],jg[210],yq[210];
void addb(int a,int b,int c)
{
v[bs]=b;
w[bs]=c;
ne[bs]=fr[a];
fr[a]=bs;
bs+=1;
}
void bfs()
{
for(int i=1;i<=n+m;i++)
bk[i]=false;
int he=0,ta=0;
for(int i=1;i<=m;i++)
{
if(sy[i]>0)
{
dl[ta]=i+n;
la[i+n]=-1;
bk[i+n]=true;
ta+=1;
}
}
while(he<ta)
{
for(int i=fr[dl[he]];i!=-1;i=ne[i])
{
if(w[i]>0&&!bk[v[i]])
{
bk[v[i]]=true;
dl[ta]=v[i];
la[v[i]]=i;
lad[v[i]]=dl[he];
ta+=1;
}
}
he+=1;
}
}
void jisuan()
{
for(int i=1;i<=n;i++)
{
bfs();
for(int j=1;j<=m;j++)
xz[i][j]=bk[n+j];
int t=-1;
for(int j=1;j<=m;j++)
{
if((bk[n+j]&&zy[i][j]>0)&&(t==-1||zy[i][j]<zy[i][t]))
t=j;
}
if(t==-1)
{
jg[i]=m+1;
continue;
}
jg[i]=zy[i][t];
int x=t+n;
while(1)
{
if(la[x]==-1)
{
sy[x-n]-=1;
break;
}
w[la[x]]-=1;
w[la[x]^1]+=1;
x=lad[x];
}
for(int j=1;j<=m;j++)
{
if(zy[i][j]==zy[i][t])
{
if(j==t)
{
addb(i,j+n,1);
addb(j+n,i,0);
}
else
{
addb(j+n,i,1);
addb(i,j+n,0);
}
}
}
}
}
int main()
{
int T,C;
scanf("%d%d",&T,&C);
while(T--)
{
bs=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n+m;i++)
fr[i]=-1;
for(int i=1;i<=m;i++)
scanf("%d",&sy[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&zy[i][j]);
}
for(int i=1;i<=n;i++)
scanf("%d",&yq[i]);
jisuan();
for(int i=1;i<=n;i++)
printf("%d ",jg[i]);
printf("\n");
for(int i=1;i<=n;i++)
{
int l=0,r=i;
while(l<r)
{
int mi=(l+r)>>1;
bool zd=false;
for(int j=1;j<=m;j++)
{
if(xz[i-mi][j]&&zy[i][j]!=0&&zy[i][j]<=yq[i])
{
zd=true;
break;
}
}
if(zd)
r=mi;
else
l=mi+1;
}
printf("%d ",l);
}
printf("\n");
}
return 0;
}
LNOI2018 劈配的更多相关文章
- BZOJ5251 八省联考2018劈配(网络流)
劈配,匹配,网络流.那么考虑怎么跑网络流. 先看第一问.首先套路的建出超源超汇.不用想也知道导师向汇连容量为战队人数上限的边.特别地,给出局也建一个点,向汇连容量inf的边(似乎没有必要).对于一个新 ...
- 【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)
[BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序 ...
- [BZOJ5251][九省联考2018]劈配(网络流)
5251: [2018多省省队联测]劈配 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 33 Solved: 22[Submit][Status][ ...
- [BZOJ5251][多省联测2018]劈配
bzoj luogu sol 从前往后依次加边,每次对一个人做完劈配后就把当前这个残余网络存下来.这样第二问就可以二分排在第几名然后check一下在对应排名的残余网络上还能不能再增广. 给网络流开结构 ...
- [八省联考2018] 劈配 mentor
Description 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. Input 轻车熟路的Zay ...
- bzoj 5251: [2018多省省队联测]劈配
Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayi ...
- bzoj5251 [2018多省省队联测]劈配
直接网络流模拟即可AC. 可持久化+暴力=90分, 可持久化+二分=30分, 暴力加边+二分=100分. 我也很无奈啊. Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化…… ...
- bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)
https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...
- BZOJ.5251.[八省联考2018]劈配mentor(最大流)
BZOJ 洛谷 对于每个人,每次枚举一个志愿看是否能增广即可. 对于第二问,可以保留第一问中\(n\)次增广前后的\(n\)张图,二分,在对应图上看是否能增广即可. 貌似匈牙利的某种写法比网络流优多了 ...
随机推荐
- vim入门一 常用指令
以下为自己常用的vim指令总结 一.插入命令 a 在光标所在字符后进入插入模式 A 调到光标所在行行尾进入插入模式 i 在光标所在字符前插入模式 I 调到光标所在行行首进入插入模式 o 调到光标所在上 ...
- selenium cookie 登录
前言 爬虫方向的小伙伴们都知道网页爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以简单的send key来输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,这时候就体现到了co ...
- 1205: 求一元二次方程的实数根(C)
一.题目 acm.wust.edu.cn/problem.php?id=1205&soj=0 二.分析 一元二次方程有三个系数a.b.c,两个根x1.x2,以及d(德尔塔): a.b.c均为实 ...
- hdu 1285 拓扑
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- JS OOP -03 JS类的实现
JS类的实现: a.理解类的实现机制 b.使用prototype对象定义类成员 c.一种JS类的设计模式 a.理解类的实现机制 在JS中可以使用function关键字来定义一个类. 添加类的成员,在函 ...
- javadoc 自动生成java帮助文档
用法: javadoc [options] [packagenames] [sourcefiles] 选项: -public 仅显示 public 类和成员 -protected 显示 protect ...
- siamese跟踪论文思考
转载自:https://zhuanlan.zhihu.com/p/34222060 通过作者在专栏里面放的几张响应图我们可以看到:SiamFC并不能区分不同的物体,图片上所有具有语义信息的物体都会得到 ...
- MFC如何显示位图
1. 资源文件中加载 bmp 2.1. 静态加载图片 在属性下设置为如下即可 2.2 动态加载图片 其中要在控件中添加CStatic变量,并且属性设置为如下 并且在按钮控件中加入 如下代码 void ...
- Unity 自定义"=="操作符 [翻译来源blogs.unity3d,2014/05]
主要内容来源 https://blogs.unity3d.com/cn/2014/05/16/custom-operator-should-we-keep-it/ 在我们代码里,如果有这样的代码: i ...
- 理解JVM之内存分配以及分代思想实现
1.基本内存分批策略 大多数情况在新生代Eden区分配,如果启动了本地线程分配缓冲,将按线程优先在TLAB(线程私有缓冲区)上分配.当Eden区域没有足够的空间时将发起一次Minor GC. 值得注意 ...