题意

传送门

有 \(a+b+1\) 个会动的棋子,在一个大小为 \(n\times m\) 的棋盘上,棋盘上有一些点有障碍。棋子中,有 \(a\) 个红色棋子,\(b\) 个蓝色棋子,和 \(1\) 个既能当作红棋子又能当作蓝棋子的通配棋子。

一个局面是好的,当且仅当对于每个格子,要么这个格子上没有棋子,要么这个格子上恰好存在一个红棋子与一个蓝棋子。

每个棋子有自己的初始位置 \((x_i,y_i)\) 和速度 \(t_i\),其中 \(t_i\) 表示自己走到相邻的格子所需要的时间。

你可以控制所有棋子的移动。请问最少多少时间后能达到处于一个好的局面。或输出无解。

\(1 \le n,m \le 22,0 \le a,b \le n \times m,1 \le t_i \le 10^9\)。

题解

首先 \(|a-b|=1\),否则无解。然后就变成 \(k\) 个红棋子与 \(k\) 个蓝棋子。

乍一看是二分图匹配。但实际上每个格子只能容纳一对棋子,故不能直接套用。

类似二分图,我们不难想到用网络流来解决这种匹配问题。因为每个棋子到任意格子的距离是已知的,故尝试二分答案。

首先将每个格子拆为入点和出点,其间连一条边。依次考虑红棋子 \(i\) 与格子 \(j\),如果 \(i\) 到 \(j\) 的时间不大于当前二分的 \(mid\),则从 \(i\) 连一条边到 \(j\) 的入点。同理,如果蓝棋子 \(i\) 到格子 \(j\) 的时间不大于 \(mid\),则从 \(j\) 的出点连一条边到 \(i\)。再从源点到所有红棋子连边,从所有蓝棋子到汇点连边。所有边的容量均为 \(1\)。跑最大流,判断其是否等于 \(k\) 即可。

这种做法的时间复杂度为 \(O(n^6 \log a)\),其中 \(a\) 为最大时间。显然不能通过。

发现瓶颈在于二分答案。因为网络流有一个很好的性质:往网络中加边,不必重构网络,直接跑就可以得出新的最大流。于是尝试另一种方式:对于所有连接棋子与格子的边,按照其时间从小到大加入。每加一条边跑一次最大流。则当最大流等于 \(k\) 时,加入的边的时间就是答案。复杂度为 \(O(n^4 \times n^4)=O(n^8)\)。

这样就有新的优化空间了。考虑将边分块:设有 \(t\) 条边,每 \(\sqrt t\) 条分为一组。每次加入一组并跑最大流。当最大流等于 \(k\) 时,再将这组的边重新一条条加入。这样的复杂度为 \(O(\sqrt{n^4} \times n^4)=O(n^6)\)。可以通过。

但实际上因为大常数,你还是会 TLE on test 87。解决办法是卡常,或者像我一样:分块套分块。设一个阈值 \(\alpha\),先将块长设为 \(t^{\alpha}\),等最大流等于 \(k\) 时,再将当前块分块,块长为 \(\displaystyle t^{\alpha^2}\)。则复杂度为 \(\displaystyle O((t^{1-\alpha}+t^{\alpha(1-\alpha)}+t^{\alpha^2})\times n^4)\),易知 \(\alpha=\frac{\sqrt5-1}{2}\),化简一下就是 \(n^{5.528}\)。可以通过。

最新文章

  1. laravel安装
  2. WordPress 的 Google 字体问题解决办法
  3. 软件工程(C编码实践篇)课程总结
  4. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd
  5. 【ipython技巧】使用shell命令
  6. XMPP协议、IM、客户端互联详解
  7. 真正明白C语言二级指针(转载)
  8. Setting Up the ADT Bundle
  9. bootargs中的环境变量说明和一些常用的uboot命令
  10. JSC学习笔记:JavaScriptCore 初识
  11. Checking Network Configuration requirements Failed
  12. list,map的疑问
  13. Java 模拟队列(一般队列、双端队列、优先级队列)
  14. Java线程小记
  15. peewee基本操作
  16. array_filter、array_walk、array_map的区别
  17. VMware5.5-vCenter Converter(转换)
  18. phpredis Redis阵列 Redis Arrays
  19. SpringBoot 文件上传、下载、设置大小
  20. (笔记)Linux 如何查看线程数最佳解决方案

热门文章

  1. vue node Failed at the iview-admin
  2. LP1-5:接口测试方法
  3. 右键无法新建word文件怎么办?
  4. wpa_supplicant 交叉编译
  5. grafana+prometheus+tomcat 监控tomcat
  6. Pytest之生成allure报告
  7. 03java基础(二)java面向对象
  8. C# Thread.Join()作用
  9. 合格できる日本語能力試験, N1.PDF
  10. Scoped方法(防止样式名称冲突)