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\)张图,二分,在对应图上看是否能增广即可. 貌似匈牙利的某种写法比网络流优多了 ...
随机推荐
- soapUI对webservices进行压力测试
1.进行压力测试步骤 1.创建soap项目file--new soap project 为项目命名,输入wsdl,之后会出现下图 其中matchToApply是webservice对外提供访问的接口( ...
- PPT 中用 LaTeX 插入公式、PowerPoint 中用 LaTeX 插入公式(4)
步骤: 1. 安装 CTex 2. 安装 IguanaTex >> 下载链接1:官网 >> 下载链接2:复制链接到迅雷或IDM下载很快 3. 将「IguanaTex_v1_56 ...
- Windows10下安装numpy
1.https://bootstrap.pypa.io/get-pip.py 下载get-pip.py(右键另存为即可) 2.命令行下在get-pip.py所在文件夹下运行get-pip.py 3.命 ...
- Django自定义分页并保存搜索条件
Django自定义分页并保存搜索条件 1.自定义分页组件pagination.py import copy class Pagination: def __init__(self, current_p ...
- Dubbo#编译动态扩展类
这篇排版有问题 后面修改....**** 以ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();为例 - ...
- vue中设置全局的css样式
只需在main.js ====import './style.less' main.js =>> import Vue from 'vue' import App from ...
- asp.net core-5.控制台读取json文件
1,创建控制台应用程序,应用using Microsoft.Extensions.Configuration; 2,新建一个app.json文件 然后修改app.json的属性 3,生成项目,可以看到 ...
- s5p6818 从SD卡启动程序(制作SD启动卡)
背景: 最近在学习uboot,其中有一步很重要的任务就是需要实现uboot 的验证,没有办法验证uboot是不是自己做的,那么整个开发就会收到阻碍.另外,从公司现在开发的板子来看,uboot从sd卡启 ...
- (十)mybatis之缓存
一.缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)去查询,从缓存中进行查询,从而提高查询效率,解决了高并发系统的性能问题. 二.mybatis ...
- tfs如何为工作项添加变更集
今天工作中遇到的,可惜之前没怎么用过TFS. 我这是最后一次签入的时候关联了工作项.目的是要把先前签入的绑定到该任务上. 团队自愿管理器->查找历史记录->双击最后一次绑定工作项的变更集- ...