B 国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone)。传说中,连环阵是一种永不停滞的自发性智能武器。但经过 A 国间谍的侦察发现,连环阵其实是由 M 个编号为 1,2,…,M 的独立武器组成的。最初,1 号武器发挥着攻击作用,其他武器都处在无敌自卫状态。以后,一旦第 i(1≤i 为了彻底打击 B 国科学家,A 国军事部长打算用最廉价的武器——炸弹来消灭连环阵。经过长时间的精密探测,A 国科学家们掌握了连环阵中 M 个武器的平面坐标,然后确定了 n 个炸弹的平面坐标并且安放了炸弹。每个炸弹持续爆炸时间为 5 分钟。在引爆时间内,每枚炸弹都可以在瞬间消灭离它平面距离不超过 k 的、处在攻击状态的 B 国武器。和连环阵类似,最初 a1 号炸弹持续引爆 5 分钟时间,然后 a2 号炸弹持续引爆 5 分钟时间,接着 a3 号炸弹引爆…以此类推,直到连环阵被摧毁。 显然,不同的序列 a1,a2,a3… 消灭连环阵的效果也不同。好的序列可以在仅使用较少炸弹的情况下就将连环阵摧毁;坏的序列可能在使用完所有炸弹后仍无法将连环阵摧毁。现在,请你决定一个最优序列 a1,a2,a3… 使得在第 ax 号炸弹引爆的时间内连环阵被摧毁。这里的 x 应当尽量小。 第一行包含三个整数:M、n 和 k,分别表示 B 国连环阵由 M 个武器组成,A 国有 n 个炸弹可以使用,炸弹攻击范围为 k。以下 M 行,每行由一对整数 xi,yi 组成,表示第 i 号武器的平面坐标。再接下来 n 行,每行由一对整数 ui,vi 组成,表示第 i 号炸弹的平面坐标。输入数据保证随机、无误、并且必然有解。 一行包含一个整数 x,表示实际使用的炸弹数。 输入 #1复制 输出 #1复制 对于 100% 的数据,1≤M,n≤100,1≤k≤1000,0≤xi,yi≤10000,0≤ui,vi≤10000。 各个测试点 2 NOI2003 智破连环阵 有 m 个靶子 (axj,ayj) 和 n 个箭塔 (bxi,byi)。每个箭塔可以射中距离在 k 以内的靶子。第 i+1 只有第 i 个靶子被射中时才能被射中。每个箭塔只能用一次,现在可以安排每个箭塔的射击顺序,求最少需要几个箭塔可以射光 m 靶子。 数据范围:1≤m,n≤100,1≤k≤1000,1≤axj,ayj,bxi,byi≤10000。 爆搜神题,可惜题解都很晦涩,蒟蒻因为一个小错误折腾了一个晚上,现在拿到了最优解,于是准备写个逊逊的题解。 首先每个箭塔解决一个靶子区间。 所以可以爆搜每个区间和箭塔匹配,这很明显是个二分图匹配。 为了方便处理很多细节,设所有 i 为箭塔的下标,j 为靶子的下标。 设 由于每个箭塔的每个负责区间只需用后缀就可以有解,所以记录 nexi,j 表示箭塔 i 在靶子 j 后面第一个射不到的靶子(即可用射到最右边的靶子下标 +1)。 为了后面 然后就可以开始惊心动魄的 最直接的方法是先用 mnj 来剪枝 前文说过这是个二分图匹配,所以有个野蛮操作(二分图优化):每次区间找好后,直接匈牙利匹配看看能不能匹配得到箭塔。 这个操作时间复杂度比起原来操作是不增的。 但是这有什么用呢?要配上另一个骚操作:逆序枚举下一个区间开始端点。 由于用了匈牙利后完美匹配概率变高,所以就可以尽早找到优的答案,进一步 然后就结束了,时限 2s 的题跑得最慢的点 4ms,总时间 31ms。 注意 祝大家学习愉快!输入格式
输出格式
输入输出样例
4 3 6
0 6
6 6
6 0
0 0
1 5
0 3
1 1
2
说明/提示
题面
蒟蒻语
蒟蒻解
bool
coni,j 表示箭塔 i 与靶子 j 联通。// 这是一个很显然的递推
R(i,0,n)L(j,0,m) con[i][j]&&(nex[i][j]=max(j+1,nex[i][j+1]));
A*
做准备,还可以求出一个 mnj 表示打到靶子 j 的剩余步数下限。L(j,0,m)R(i,0,n) con[i][j]&&(mn[j]=min(mn[j],mn[nex[i][j]]+1));
Dfs
了。A*
一下,然后用 nexi,j 枚举下一个区间端点,用过的箭塔打个标记,匹配一个没用过的箭塔。A*
剪枝。Dfs
回溯算法两个坑:回溯不彻底、回溯用了全局变量。
代码
#include