Educational Codeforces Round 124
https://codeforces.com/contest/1651
F. Tower Defense
塔防游戏, i位置上 塔 能量上限c[i] 每秒充能r[i], 初始满能量
一关卡 生成 q 个怪, 第j个怪, 在point 1位置, tj时刻, 生成, 血量hj, 移动速度1格子/s
当怪经过 塔时, 塔对它 造成 min(怪血量,塔能量) 的伤害, 并且消耗同样多能量
但是还是会有的怪 活着经过所有塔
求 或者的怪的血量和
范围
n 2e5
ci,ri [1,1e9]
q 2e5
tj [0,2e5] 保证严格单调递增
hj [1,1e12]
我的思路
假设 每个怪都不死, 而且每个塔充能无上限
那么除了第一个怪, 第i个怪 受到的伤害 = (i与i-1的时间差) * (sum r)
但似乎没有什么帮助
再看 既然 伤害唯一来源是塔, 那么 伤害 + 剩余血量 = 总血量
如果能计算出塔实际造成的伤害, 那么 剩余血量也可以算出
第一个塔
min(c[1],h[1]): c[1] -> c[1] - min(c[1],h[1]) = p[1]
min(c[1],p[1]+r[1](t[2]-t[1]),h[2])
.. 感觉就是关联很紧, 如何消除这种 强关联
第一个 假设在 塔i倒下 或 塔j倒下, 有啥不同
i倒下, 说明i-1都是完全能量, j 倒下,说明j-1塔都是完全能量, min(i,j) -1 都是完全能量
所以看起来需要一个前缀能量和
而第二个 如果 在 p2 倒下, 第一个在p1 倒下
那么 如果哦 p2 < p1 对于 前 p2-1 对 第二个造成的伤害 就是 = sum min((t[2]-t[1])r[i],c[i])
一个与t,i 相关的 函数, 对于给定t, 随i严格单调递增, 但是问题是 难以?快速求点值, 不然可以二分
另一个问题, 如果 p2 > p1, 那么超出的部分还要和 更前面的相关
想拆一个单独x, 或者调整血量, 似乎都没啥能和原题方案一致的办法
感觉很卡在一个 无法快速计算一轮的结果
换个视角, 不按怪来看, 按塔来看
第一个塔接受的是 (t0,h0) (t1,h1) …
输出的内容被第塔接受, 而可以通过时间偏移让时间不变 (t0,h0_1) (t1,h1_1) (t2,h2_1)...
那么问题变成
有一堆点 (t0,h0) (t1, h1)
依次 n个操作 (ri,ci), 对每个点的高度进行修改, 问最后的高度和
看起来 每个h变化在允许小于0时, 下降要么是 ci, 要么是间隔 * ri ?
但实际上并不是, 可能是击倒了上一个 有残余
但是每个单位最多被击倒一次!
n次 残余情况, 剩下的都是 ci, 间隔 * ri
如果 h > ci 一定不被击倒, 如果 h < min(间隔 * ri, ci), 一定被击倒
还剩 间隔 * ri < h < ci
的情况
感觉上需要 实现一定的区间操作, 而且可能需要先排序什么的?