interlinkage:

https://codeforces.com/contest/1139/problem/E

description:

有$n$个学生,$m$个社团,每个学生有一个能力值,属于一个社团,在接下来的$d$天里,每天会有一个人退出所在的社团。

每天从每个社团中选出最多一个人组成能力值集合${p_i}$使得其$mex$最大。求出每天的最大$mex$值

solution:

  • $mex$经常与二分图模型相关;
  • 若答案为$t$,每一个小于$t$的能力值都对应一个提供它的社团。由此构造二分图,左侧是能力值,右侧是社团。若社团$c_i$存在一个学生能力值为$p_i$,那么$p_i$向$c_i$连边;
  • 这样跑匈牙利就是了;
  • 但是注意到学生是在动态变化的,随着天数的变化学生不断减少,我们要对二分图实行删边操作。但是匈牙利算法是不支持删边的;
  • 于是我们从最后一天开始倒着来,每天加边,这样的话答案就是非严格单调增的;
  • 加边不会影响之前的匹配,倒序输出即可;

code:

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std; const int N=1e4+;
int n,m,tot;
int head[N<<],a[N],b[N],c[N],used[N],match[N],ans[N];
struct EDGE
{
int to,nxt;
}edge[N<<];
void add(int u,int v)
{
edge[++tot]=(EDGE){v,head[u]};
head[u]=tot;
}
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int find(int x)
{
if (used[x]) return ;
used[x]=;
for (int i=head[x];i;i=edge[i].nxt)
if (match[edge[i].to]==-||find(match[edge[i].to]))
{
match[edge[i].to]=x;
return ;
}
return ;
}
int main()
{
memset(match,-,sizeof(match));
n=read();m=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++) b[i]=read();
int q=read();
for (int i=;i<=q;i++) c[i]=read(),used[c[i]]=;
for (int i=;i<=n;i++) if (!used[i]) add(a[i],b[i]);
int t=;
for (int i=q;i>=;i--)
{
memset(used,,sizeof(used));
while (find(t))
{
++t;
memset(used,,sizeof(used));
}
ans[i]=t;
add(a[c[i]],b[c[i]]);
}
for (int i=;i<=q;i++) printf("%d\n",ans[i]);
return ;
}

最新文章

  1. SVN 修改log信息报错的解决方案
  2. iOS 状态栏黑色背景白色字体
  3. Python之路 day2 字符串函数
  4. 关于async
  5. request获取json
  6. MySQL复制中slave延迟监控
  7. Maven打包时囊括本地依赖的jar包
  8. IE的@cc_on条件编译
  9. QT 内存泄露 检测
  10. 南阳师范学院ACM集训队博客使用方法
  11. 用Collections.synchronizedCollection创建线程安全的集合、列表。。。
  12. canvas(七) 文字编写
  13. Python小代码_6_列表推导式求 100 以内的所有素数
  14. CMD运行命令每次都要进入很麻烦
  15. linux中ip命令使用介绍
  16. 2018-2019-2 20175234 实验二《Java面向对象程序设计》实验报告
  17. Oracle 11gR1 RAC存储迁移方案
  18. Manjaro更新出现冲突
  19. java7 java MethodHandle解析
  20. [Luogu]A%BProblem——线性筛素数与前缀和

热门文章

  1. Excel 出现后三位为000的情况
  2. QT设计UI:QT模式对话框打开文件
  3. 利用string 字符串拷贝
  4. 浅析Python3中的bytes和str类型 (转)
  5. X509 颁发者和使用者 详解
  6. Spring AOP --JDK动态代理方式
  7. buildroot的make menuconfig配置
  8. eslint 校验去除
  9. 2.6、Flask扩展
  10. 渗透实战(周四):CSRF跨站域请求伪造