题面

传送门

Sol

网络流辣

枚举每个点的最优匹配,然后只建最优匹配的边跑网络流
下一个点的图中,保证上一个点只连了最优匹配的边
直接整个图复制过来

然后二分答案一个点向上跳多少
和上面一样建图\(check\)

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
# define Copy(a, b) memcpy(a, b, sizeof(a))
# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
using namespace std;
typedef long long ll;template <class Int>
IL void Input(RG Int &x){RG int z = 1; RG char c = getchar(); x = 0;for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);x *= z;
}const int maxn(405);
const int oo(1e9);int testcase, c, n, m, b[maxn], s[maxn], S, T, ans[maxn];
queue <int> Q;struct Max_Flow{int max_flow, cur[maxn], first[maxn], cnt, lev[maxn];struct Edge{int to, f, next;} edge[maxn * 20];IL void Init(){cnt = 0, Fill(first, -1);}IL void Add(RG int u, RG int v, RG int f){edge[cnt] = (Edge){v, f, first[u]}, first[u] = cnt++;edge[cnt] = (Edge){u, 0, first[v]}, first[v] = cnt++;}IL int Dfs(RG int u, RG int maxf){if(u == T) return maxf;RG int ret = 0;for(RG int &e = cur[u]; e != -1; e = edge[e].next){RG int v = edge[e].to;if(lev[v] != lev[u] + 1 || !edge[e].f) continue;RG int f = Dfs(v, min(edge[e].f, maxf - ret));ret += f, edge[e].f -= f, edge[e ^ 1].f += f;if(ret == maxf) break;}if(!ret) lev[u] = 0;return ret;}IL int Bfs(){Fill(lev, 0), Q.push(S), lev[S] = 1;while(!Q.empty()){RG int u = Q.front(); Q.pop();for(RG int e = first[u]; e != -1; e = edge[e].next){RG int v = edge[e].to;if(!edge[e].f || lev[v]) continue;lev[v] = lev[u] + 1;Q.push(v);}}return lev[T];}IL int Dinic(){max_flow = 0;while(Bfs()) Copy(cur, first), max_flow += Dfs(S, oo);return max_flow;}
} mp[maxn], tmp;struct Map{int first[maxn], cnt;struct Edge{int to, next;} edge[maxn * 10];IL void Init(){cnt = 0, Fill(first, -1);}IL void Add(RG int u, RG int v){edge[cnt] = (Edge){v, first[u]}, first[u] = cnt++;}
} edge[maxn];int main(RG int argc, RG char *argv[]){File("mentor");for(Input(testcase), Input(c); testcase; --testcase){Input(n), Input(m), T = n + m + 1;for(RG int i = 0; i <= n; ++i) mp[i].Init(), ans[i] = 0;for(RG int i = 1; i <= m; ++i) Input(b[i]), mp[0].Add(i + n, T, b[i]);for(RG int i = 1; i <= m; ++i) edge[i].Init();for(RG int i = 1; i <= n; ++i){for(RG int j = 1, x; j <= m; ++j){Input(x);if(x) edge[x].Add(i, j + n);}for(RG int j = 1; j <= m; ++j){for(RG int k = S; k <= T; ++k) mp[i].first[k] = mp[i - 1].first[k];mp[i].cnt = mp[i - 1].cnt;for(RG int k = 0; k < mp[i].cnt; ++k) mp[i].edge[k] = mp[i - 1].edge[k];mp[i].Add(S, i, 1);for(RG int e = edge[j].first[i]; e != -1; e = edge[j].edge[e].next)mp[i].Add(i, edge[j].edge[e].to, 1);if(mp[i].Dinic()){ans[i] = j;break;}}if(!ans[i]) ans[i] = m + 1;printf("%d ", ans[i]);}puts("");for(RG int i = 1; i <= n; ++i) Input(s[i]);for(RG int i = 1; i <= n; ++i){if(ans[i] <= s[i]){putchar('0'), putchar(' ');continue;}RG int l = 1, r = i - 1, ret = 0;while(l <= r){RG int mid = (l + r) >> 1;for(RG int k = S; k <= T; ++k) tmp.first[k] = mp[mid - 1].first[k];tmp.cnt = mp[mid - 1].cnt;for(RG int k = 0; k < mp[mid - 1].cnt; ++k) tmp.edge[k] = mp[mid - 1].edge[k];tmp.Add(S, i, 1);for(RG int j = 1; j <= s[i]; ++j)for(RG int e = edge[j].first[i]; e != -1; e = edge[j].edge[e].next)tmp.Add(i, edge[j].edge[e].to, 1);if(tmp.Dinic()) ret = mid, l = mid + 1;else r = mid - 1;}printf("%d ", i - ret);}puts("");}return 0;
}

转载于:https://www.cnblogs.com/cjoieryl/p/8761198.html

Bzoj5251: [2018多省省队联测]劈配相关推荐

  1. bzoj5248 [2018多省省队联测]一双木棋

    5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 155  Solved: 132 [Submit][St ...

  2. bzoj5252: [2018多省省队联测]林克卡特树

    题目链接 bzoj5252: [2018多省省队联测]林克卡特树 题解 tu优化! 其实之前做过类似的,思想类似,二分一个价值的偏移量来逼近限制k,大概是clj出的一道集训队胡策啥来着?? 对于本题, ...

  3. BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)

    题意 题目链接 Sol 不难发现题目给出的是一个树,其中\(\frac{i}{K}\)是\(i\)的父亲节点 首先,当\(d_i\)互不相同时,一个显然的贪心策略就是优先给编号小的分配较大的权值.可以 ...

  4. bzoj5252 [2018多省省队联测]林克卡特树

    斜率优化树形dp?? 我们先将问题转化成在树上选K+1条互不相交路径,使其权值和最大. 然后我们考虑60分的dp,直接维护每个点子树内选了几条路径,然后该点和0/1/2条路径相连 然后我们会发现最后的 ...

  5. BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)

    题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...

  6. bzoj 5248: [2018多省省队联测]一双木棋

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

  7. BZOJ5248 [2018多省省队联测]一双木棋(状压+记忆化搜索)

    题目链接:BZOJ 5248 题目描述: 菲菲和牛牛在一块n行m列的棋盘上下棋(n,m<=10),菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋 ...

  8. BZOJ 5248: [2018多省省队联测]一双木棋(对抗搜索+记忆化)

    题目传送门 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 思路 显然每个局面,落子无悔后都是一个从上往下的非严格递减阶梯. 所以有效的状态 ...

  9. bzoj 5248: [2018多省省队联测]一双木棋 博弈论+状压dp

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

最新文章

  1. 【二级java】 二分法查找
  2. 从外资银行上看国内银行的差距
  3. 最简单红米系统一键激活xposed框架教程
  4. SDN协议与SD-WAN中使用的协议相比有何差别?
  5. 线程池中submit()方法与execute()方法的区别
  6. Software Testing Homework03:
  7. 前端学习---html基础知识
  8. 剑指offer(纪念版)读书笔记【实时更新】
  9. 宏定义_do{...} while(0U)宏定义的作用和意义
  10. YOLO V1,V2, V3的记录
  11. oracle12.2 redo 进程,【Oracle Database 12c新特性】TTnn TMON新的redo传输后台进程
  12. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】
  13. html画布arc,绘制弧线将线性渐变html5画布(Draw arc will linear gradient html5 canvas)
  14. 条码软件如何自定义设置条形码尺寸
  15. http接口测试工具
  16. ue4风格化材质_在UE4中制作风格化场景:Bird House_资源库
  17. 渲图买桌面CPU还是服务器cpu,做图用什么显卡好,图形渲染CPU重要还是显卡重要...
  18. win10怎么更新显卡驱动_Intel发布核显新驱动:支持Win10 H2更新、11代酷睿狂喜-Intel,核显,驱动,Win10 ——快科技(驱动之家旗下媒体)-...
  19. SAP Marketing Cloud 功能概述(三)
  20. PRACH, preamble, RO 的关系与区别

热门文章

  1. 【项目调研+论文阅读】基于BERT的中文命名实体识别方法[J] | day6
  2. 【NLP】毕设学习笔记(二)transformer
  3. Linux怎么添加交换空间,如何在Ubuntu上增加swap交换空间
  4. java freemarker 模版_Java模版引擎Freemarker
  5. 用c语言写代码_教你如何用android mvp分层架构优雅写代码
  6. netty 多个 本地udp端口_如何在SpringBoot中,使用Netty实现远程调用?
  7. java读取sh脚本_linux环境下java读取sh脚本并执行
  8. redis订阅怎么退出_redis订阅关闭异常解决
  9. python 安装包列表导出到 txt
  10. px~em~pt转换表