1 条题解
-
0
题意
有 条巨龙,按顺序杀。
每条龙 有:- 生命值
- 恢复力
- 杀死后获得一把新剑(攻击力 )
玩家初始有 把剑(攻击力已知)。
打每条龙时:- 选剑规则:选攻击力 的最大攻击力剑,若没有则选最小攻击力剑。
- 用该剑攻击 次(固定的 ),每次伤害 = 剑的攻击力。
- 攻击后龙的生命变化:,若此时 ,则恢复,每次恢复 ,直到生命值 。
- 必须最终生命值 恰好为 0 才死。
求能通关所有龙的 最小正整数 ,不存在输出 。
问题分析
1. 选剑的确定
由于剑的选择规则固定,且每次杀龙后剑会变化(消失一把,获得一把),我们可以预先模拟整个过程的选剑结果。
设 表示打第 条龙时使用的剑的攻击力。
模拟方法:
- 用平衡树(如
std::multiset
)维护当前拥有的剑。 - 对于龙 :
- 在平衡树中找 的最大元素(可用
upper_bound(a_i)
前一个元素),如果不存在则取最小元素(begin()
)。 - 使用该剑,从平衡树中删除它。
- 加入杀死该龙获得的剑 。
- 在平衡树中找 的最大元素(可用
这样我们得到序列 。
2. 转化为同余方程
对于第 条龙,攻击 次后,造成的伤害是 。
攻击后生命值:
龙恢复 次()后生命值恰好为 ,即:
整理得:
并且需要满足:
$$x \cdot \text{ATK}_i \ge a_i \quad\text{(因为恢复前生命值要 ≤ 0)} $$
3. 同余方程标准化
方程:
设 。
若 ,则无解,直接输出 。
否则令:
$$A_i = \frac{\text{ATK}_i}{d_i}, \quad B_i = \frac{a_i}{d_i}, \quad P_i = \frac{p_i}{d_i} $$方程化为:
由于 ,可求 在模 下的逆元 ,得到:
设:
其中 。
4. 合并同余方程
现在我们得到若干方程:
...
用 扩展中国剩余定理 (ExCRT) 合并这些方程。
ExCRT 合并两个方程:
设 ,代入第二式:
设 ,若 则无解。
$$\frac{m_1}{d} \cdot t \equiv \frac{r_2 - r_1}{d} \pmod{\frac{m_2}{d}} $$
否则化为:解出 ,即 。
代回得:
$$x = r_1 + m_1 \cdot \left(t_0 + k \cdot \frac{m_2}{d}\right) = (r_1 + m_1 \cdot t_0) + k \cdot \frac{m_1 m_2}{d} $$所以新方程:
$$x \equiv r_1 + m_1 \cdot t_0 \pmod{\mathrm{lcm}(m_1, m_2)} $$重复合并直到所有方程合并成一个 。
5. 处理攻击力下限条件
我们还有条件:
即:
设:
$$L = \max_{i=1}^n \left\lceil \frac{a_i}{\text{ATK}_i} \right\rceil $$最终 必须 且满足同余方程 。
6. 求解最小正整数解
设最终合并为:
最小非负解是 (调整为 范围内)。
如果 ,则答案为 。
否则,需要找到最小的 且 :取 (如果 ),则:
算法步骤
- 读入数据。
- 用
multiset
模拟选剑过程,得到 。 - 对每条龙:
- 检查 ,否则输出 。
- 标准化方程,得到 。
- 用 ExCRT 合并所有同余方程,得到 。
- 计算 。
- 找最小 满足同余式。
- 输出结果。
时间复杂度
- 模拟选剑:
- ExCRT:
- 总体可行。
样例验证
以第一组数据为例:
输入:
3 3 3 5 7 4 6 10 7 3 9 1 9 1000
模拟选剑:
- 龙1: ,剑 {1,9,1000},选1,得新剑7 → {7,9,1000}
- 龙2: ,选7,得新剑3 → {3,9,1000}
- 龙3: ,选3,得新剑9 → {9,9,1000}
所以 ATK = [1, 7, 3]。
解方程:
- 龙1: →
- 龙2: →
- 龙3: →
合并:
-
与
解 : → →
→ -
与
解 : → →
→
$L = \max(\lceil 3/1 \rceil, \lceil 5/7 \rceil, \lceil 7/3 \rceil) = \max(3, 1, 3) = 3$
,所以答案是 ,符合样例。
代码实现注意事项
- 使用
multiset
维护剑的集合。 - 注意选剑规则:
upper_bound
前一个元素。 - 大数运算使用
long long
,乘法可能溢出,要用快速乘或__int128
。 - 检查无解情况:① 同余方程无解 ② 逆元不存在(但这里标准化后互质,一定有逆元)③ 恢复前生命值不能 >0 的情况已在 中处理。
- 1
信息
- ID
- 3226
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者