Description


Input

Output

输出到文件 mentor.out 中。
按顺序输出每组数据的答案。对于每组数据,输出 2 行:
• 第 1 行输出 n 个用空格隔开的正整数,其中第 i 个整数的意义为:
– 在最优的录取方案中,编号为 i 的选手会被该档志愿录取。
– 特别地,如果该选手出局,则这个数为 m + 1。
• 第 2 行输出 n 个用空格隔开的非负整数,其中第 i 个整数的意义为:
– 使编号为 i 的选手不沮丧,最少需要让他上升的排名数。
– 特别地,如果该选手一定会沮丧,则这个数为 i。

Sample Input

输入1:

3 5
2 2
1 1
2 2
1 2
1 1
2 2
1 1
1 2
1 2
2 1
2 2
1 1
0 1
0 1
2 2

输入2:

1 5
4 3
2 1 1
3 1 3
0 0 1
3 1 2
2 3 1
2 3 3 3

Sample Output

输出1:

2 1
1 0
1 2
0 1
1 3
0 1

【样例 1 解释】

三组数据分别与【题目描述】中的三个表格对应。
对于第 1 组数据:由于选手 1 没有填写第一志愿,所以他一定无法被第一志愿录
取,也就一定会沮丧。选手 2 按原排名就不沮丧,因此他不需要提升排名。
对于第 2 组和第 3 组数据:1 号选手都不需要提升排名。而希望被第一志愿录取的
2 号选手都必须升到第 1 名才能如愿。

输出2:

1 1 3 2
0 0 0 0

【样例 2 解释】

1 号选手的第一志愿只填写了 2 号导师,因此 1 号选手必定被 2 号导师录取。
2 号选手的第一志愿只填写了 3 号导师,因此 2 号选手必定被 3 号导师录取。
由于 2,3 号导师均满员,且 3,4 号选手均填写了 1 号导师,因此它们都会被 1 号导
师录取。
所以 1,2 号选手均被第 1 志愿录取,3 号选手被第 3 志愿录取,4 号选手被第 2 志
愿录取。
由于他们都如愿以偿了,所以他们都不需要提升名次。

Data Constraint

Solution

  • 题面真的很长……

  • 一看数据范围 n,m≤200n,m\le200,嗯,网络流。

  • 由于每次都是最优方案,所以最终每个人选的志愿都是唯一固定的。

  • 我们只需要知道他们到底选了哪个志愿,不需要知道具体选了哪个老师。

  • 题目有两个问,考虑先做第一个问。

  • 假设前 i−1i-1 个人已经处理完了,现在要求出第 ii 个人的最优志愿 f[i]f[i]。

  • 考虑 二分 这第 ii 个人最好能选第几志愿,设为 midmid ,接着判断 ii 能否选志愿 midmid 。

  • 具体方法:建源汇点 s,ts,t ,ss 向 11 到 ii 各连一条容量为 11 的边,

  • 之后每位导师 jj 向 tt 各连一条容量为 b[j]b[j] 的边。

  • 然后 11 到 i−1i-1 按照之前处理好的志愿向对应的第 f[]f[] 志愿的导师连容量为 11 的边。

  • 最后 ii 向其第 midmid 志愿的每个老师都连一条容量为 11 的边即可。

  • 每次暴力建图,跑一遍最大流,算出最大流量 sumsum ,这个流量就代表着有 sumsum 个人选了志愿。

  • 那么如何判断二分的这个 midmid 可行呢?

  • 我们可以记录一个 pre[i]pre[i] ,表示前 ii 个人按照最优方案执行后 没出局的人数

  • 如果满足:pre[i−1]+1=sumpre[i-1]+1=sum 即为满足(即第 ii 个人成功选上了)。

  • 这样我们就二分出了最优的 midmid ,更新 f[i]f[i] 即可。

  • 于是我们就求出了第一问的答案 f[i]f[i] ,先算算时间复杂度:

  • 先枚举每个人 ii O(N)O(N),在二分选志愿 O(log N)O(log\ N) ,做网络流复杂度设为 CC 。

  • 那么总时间复杂度就是 O(NC logN)O(NC\ logN) ,额,能过。

  • 那我们愉快地再来做第二问。

  • 仍然是考虑二分,对于第 ii 个人,二分他要到哪个位置,设为 midmid 。

  • 这是我们还是可以利用之前算出的 f[i]f[i] :将 11 到 mid−1mid-1 都按照 ff 的志愿连边(同上)。

  • 源汇点 s,ts,t 的连边方式也一样,不同的是点 midmid 的连边。

  • 由于我们只需要判断位置 midmid 对于第 ii 个人是否可行(不需要具体求出其选什么志愿),

  • 所以我们直接将 midmid 向 11 到 s[i]s[i] 各连一条容量为 11 的边,表示在其中任选一个志愿即可。

  • 判断也和之前一样,满足:pre[mid−1]+1=sumpre[mid-1]+1=sum 即为符合,更新答案即可。

  • 分析一下复杂度,枚举每个人 O(N)O(N) ,二分选在哪 O(log N)O(log\ N) ,之后又做网络流 CC 。

  • 复杂度还是 O(NC logN)O(NC\ logN) !于是总时间复杂度就是 O(NC logN)O(NC\ logN) ,能过本题。

Code

#include<cstdio>
#include<cstring>
#include<vector>
#include<cctype>
using namespace std;
const int N=205,M=N<<1,inf=1e9;
int n,m,s,t,tot;
int first[M],nex[M*M],en[M*M],w[M*M];
int b[N],ss[N],f[N],pre[N];
int dis[M],gap[M],cur[M];
vector<int>g[N][N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void ins(int x,int y,int z)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
inline void insert(int x,int y,int z)
{ins(x,y,z),ins(y,x,0);
}
int sap(int x,int y)
{if(x==t) return y;int use=0;for(int i=cur[x];i;i=nex[i])if(w[i] && dis[x]==dis[en[i]]+1){cur[x]=i;int num=sap(en[i],min(w[i],y-use));w[i]-=num,w[i^1]+=num,use+=num;if(use==y || dis[s]>t) return use;}cur[x]=first[x];if(!--gap[dis[x]]) dis[s]=t+1;gap[++dis[x]]++;return use;
}
inline bool check(int ii,int pos)
{tot=1;memset(first,0,sizeof(first));for(int i=1;i<=ii;i++) insert(s,i,1);for(int i=1;i<=m;i++) insert(n+i,t,b[i]);for(int i=1;i<ii;i++)if(f[i]<=m)for(int j=0;j<g[i][f[i]].size();j++) insert(i,n+g[i][f[i]][j],1);for(int j=1;j<=pos;j++)for(int i=0;i<g[ii][j].size();i++) insert(ii,n+g[ii][j][i],1);for(int i=1;i<=t;i++) cur[i]=first[i];memset(gap,0,sizeof(gap));memset(dis,0,sizeof(dis));gap[0]=t;int sum=0;while(dis[s]<=t) sum+=sap(s,inf);return sum==pre[ii-1]+1;
}
inline bool check1(int ii,int nn)
{tot=1;memset(first,0,sizeof(first));for(int i=1;i<nn;i++) insert(s,i,1);insert(s,ii,1);for(int i=1;i<=m;i++) insert(n+i,t,b[i]);for(int i=1;i<nn;i++)if(f[i]<=m)for(int j=0;j<g[i][f[i]].size();j++) insert(i,n+g[i][f[i]][j],1);for(int i=1;i<=ss[ii];i++)for(int j=0;j<g[ii][i].size();j++) insert(ii,n+g[ii][i][j],1);for(int i=1;i<=t;i++) cur[i]=first[i];memset(gap,0,sizeof(gap));memset(dis,0,sizeof(dis));gap[0]=t;int sum=0;while(dis[s]<=t) sum+=sap(s,inf);return sum==pre[nn-1]+1;
}
int main()
{int T=read(),c=read();while(T--){n=read(),m=read();for(int i=1;i<=m;i++) b[i]=read();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) g[i][j].clear();for(int j=1,x;j<=m;j++)if(x=read()) g[i][x].push_back(j);}for(int i=1;i<=n;i++) ss[i]=read();s=n+m+1,t=n+m+2;for(int i=1;i<=n;i++){int l=1,r=m;f[i]=m+1;while(l<=r){int mid=l+r>>1;if(check(i,mid)){f[i]=mid;r=mid-1;}else l=mid+1;}write(f[i]),putchar(' ');pre[i]=pre[i-1]+(f[i]<=m);}putchar('\n');for(int i=1;i<=n;i++){if(f[i]<=ss[i]){putchar('0'),putchar(' ');continue;}int l=1,r=i-1,pos=0;while(l<=r){int mid=l+r>>1;if(check1(i,mid)){pos=mid;l=mid+1;}else r=mid-1;}write(i-pos),putchar(' ');}putchar('\n');}return 0;
}

JZOJ 5640. 【NOI2018模拟4.9】劈配相关推荐

  1. [八省联考2018]劈配

    [八省联考2018]劈配 并不难的一道题,甚至比一双木棋还容易一些 关键点就是一个:怎么处理"最优结果",即总体字典序最小 显然要反悔.匹配问题反悔套路就多了 法一: 变形匈牙利算 ...

  2. BZOJ5251 八省联考2018劈配(网络流)

    劈配,匹配,网络流.那么考虑怎么跑网络流. 先看第一问.首先套路的建出超源超汇.不用想也知道导师向汇连容量为战队人数上限的边.特别地,给出局也建一个点,向汇连容量inf的边(似乎没有必要).对于一个新 ...

  3. JZOJ 5623. 【NOI2018模拟4.2】program

    Description Input Output Sample Input 10 5 8>6<2<>54< 4 7 1 10 4 4 2 9 8 10 Sample Ou ...

  4. JZOJ 5643. 【NOI2018模拟4.10】最小代价

    Description 给定一张n个点m条边的无向图,点编号1到n,每个点x有两个权值ax和bx.给定k,选出图中一个大小为k的点集S,使得S中任意两个点之间存在仅经过这个点集中的点的路径.S也存在两 ...

  5. JZOJ 5639. 【NOI2018模拟4.8】秘密袭击

    Description Input Output Sample Input [样例1 输入] 5 3 3 2 1 1 2 3 1 2 2 3 1 4 1 5 [样例2 输入] 10 2 3 2 1 1 ...

  6. JZOJ 5638. 【NOI2018模拟4.8】IIIDX

    Description Input Output Sample Input 4 2.0 114 514 1919 810 Sample Output 114 810 514 1919 Data Con ...

  7. JZOJ 5637. 【NOI2018模拟4.8】一双木棋

    Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结 束.落子的规则是:一个格子可 ...

  8. JZOJ 5629. 【NOI2018模拟4.4】Map

    Description Rin是个特别好动的少女. 一天Rin来到了一个遥远的都市.这个都市有N个建筑,编号从1到N,其中市中心编号为1,这个都市有M条双向通行的街道,每条街道连接着两个不同的建筑,其 ...

  9. JZOJ 4673. 4504. 5635. 【NOI2018模拟4.7】LCS

    Description Input Output Sample Input [样例输入1] 3 3 aaa [样例输入2] 3 3 aab [样例输入3] 1 2 a [样例输入4] 10 9 aba ...

最新文章

  1. ecshop /api/client/api.php、/api/client/includes/lib_api.php SQL Injection Vul
  2. java虚拟机指令初步学习
  3. 内存不足导致mysql关闭,CentOS6.5增加swap分区
  4. 抓包工具Charles —— 绿化、抓包入门
  5. Unirech-腾讯云服务器简介及腾讯云国际版云服务器购买流程
  6. 数字电路基础01(含半加器、全加器、逻辑化简、卡诺图化简)
  7. 浙江学生头戴“金箍”,上课走神自动通知家长
  8. 暗影精灵5风扇怎么调_惠普HP暗影精灵5 Super游戏主机改装猫头鹰风扇攻略
  9. TOMCAT原理详解及请求过程
  10. Day04 关键字、标识符、变量及运算符
  11. 剑三重置版找不到服务器,重制版客户端安装常见问题
  12. 手机UC浏览器字体放大
  13. C++Person类继承
  14. 基于Hyper-V、centos、搭建宝塔Linux结合gitLab实现前端自动化部署
  15. linux 修改主机名 命令,Linux修改主机名命令详解
  16. Cannot write to ‘’ (Success) 解决办法
  17. PDF文件的文档标题如何更改
  18. 北京计算机专业好的学校,计算机专业最好的10所学校,“北大”居于榜首,“北航”排第五...
  19. 【LINUX-vim命令】设置vim显示行号
  20. 在 Hexo 中使用 artitalk 新增说说功能

热门文章

  1. 深入理解CUDA线程层次以及关于设置线程数的思考
  2. cuda-Block和Grid设定
  3. RHEL6 64bit下更改YUM配置。yum this system is not registered with rhn的解决办法
  4. OpenMP的环境变量
  5. Matlab错误:Y must be a vector or a character array
  6. 【Python】一种超简单的变量交换方法
  7. 基于小波变换的图像边缘检测(matlab祖传代码注释)
  8. 使用Opencv的一些注意事项
  9. 科大星云诗社动态20210308
  10. 科大星云诗社动态20210407