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\)张图,二分,在对应图上看是否能增广即可. 貌似匈牙利的某种写法比网络流优多了 ...
随机推荐
- Python之数字的四舍五入(round(value, ndigits) 函数)
round(value, ndigits) 函数 print(round(1.23)) # 1 print(round(1.27)) # 1 print(round(1.23,1)) # 1.2 第二 ...
- python — 索引与pymysql模块
1. 索引 1.1 索引原理 1.什么是索引 ?-- 目录 索引就是建立起的一个在存储表阶段就有的一个存储结构,能在查询的时候加速. 2.索引的重要性: 读写比例 为 10:1,所有读(查询)的速度就 ...
- C++中如何记录程序运行时间
一.clock()计时函数clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下:clock_t clock(void) ;简单而言, ...
- TIM—基本定时器代码
使用目的:使用TIM定时器让小灯每0.5秒翻转一次亮灭 编程过程: 1-配置时基初始化结构体 2-开启定时器更新中断(即定时时间到了) 3-配置中断优先级 4-使能定时器 5-编写中断服务函数 6-编 ...
- codeforce 839d.winter is here
题意:如果一个子序列的GCD为1,那么这个子序列的价值为0,否则子序列价值为子序列长度*子序列GCD 给出n个数,求这n个数所有子序列的价值和 题解:首先得想到去处理量比较少的数据的贡献,这里处理每个 ...
- (一)第一个python语句、乘除法、获取用户输入、函数
一.print语句 >>> print "hello World!!" python2 和python3 的print是不一样的,python3的print(“h ...
- Google Drive 和 Dropbox 同步同一个文件夹目录
Dropbox 也是非常棒的同步工具,例如先进的增量上传或者更开放的 API 等.可是为什么不曾想过把 Google Drive 和 Dropbox 同时使用呢,我是说,让这两者同时云同步同一个文件 ...
- buffer 与 cache 的区别
Buffer 和 Cache buffer 和 cache 同样作为缓存,他们之间有什么区别呢? 简单来说,buffer 是即将要写入磁盘的缓存,而 cache 是从磁盘中读出来放到缓存的 参考来自: ...
- 普通选项卡+自动播放功能+向前/向后按钮 原生js
今天做了幻灯片,主要功能包括:普通选项卡,向前/向后播放按钮,向前?向后播放功能,自动播放功能 要实现简单选项卡功能是没有问题的,但是添加功能就出现各种各样的问题了 遇到的问题:1 下标问题 2普通选 ...
- 【导出导入】IMPDP table_exists_action 参数的应用
转自:https://yq.aliyun.com/articles/29337 当使用IMPDP完成数据库导入时,如遇到表已存在时,Oracle提供给我们如下四种处理方式:a.忽略(SKIP,默认行为 ...