中国的长城始于一条无限的线,所有位置的高度均为。
一些部落,会根据以下参数攻击墙壁:开始日,开始强度,开始西坐标和开始东坐标。这第一次攻击发生在一天,上范围,在强度。如果中有长城的任何部分的高度,则攻击成功,并且在一天结束时,将建造长城,以使其在高度会处于高度Ñ ≤ 1000 d 小号W¯¯ é d [ w ^ ,ë ] 小号[ w ^ ,ë ] < 小号[ w ^ ,ë ] < 小号小号(或更大,如果当天其他一些攻击以强度击中同一段)
每个部落在撤退之前将进行多达攻击,并且每次攻击都将根据之前的迭代来确定。每个部落都有一些,和\ delta_S来确定攻击顺序:两次攻击之间将等待\ delta_D \ ge 1天,对于每次攻击,他们将移动其攻击范围\ delta_X单位(负=西,正=东部),但范围的大小将保持不变,并且每次攻击后它们的强度也会以恒定值增加/减少。δ d δ X δ 小号δ d ≥ 1 δ X
该问题的目的是,在对攻击部落有完整描述的情况下,确定成功攻击多少次。
我设法编写了一个有效的解决方案,可以在20秒钟内运行:我相信我实施的解决方案需要时间,其中受到攻击的总数模拟(最大),攻击范围内唯一边缘点的总数(最大)。
从高层次来看,我的解决方案是:
- 读取所有部落信息
- 计算攻击范围的所有唯一坐标
- 将Wall表示为范围上的延迟更新的二叉树,该树跟踪最小高度值。叶是两个坐标的跨度,中间没有任何东西,所有父节点代表其子级所覆盖的连续间隔。-
- 生成每个部落将执行的所有攻击,并按天对它们进行排序
- 对于每次攻击,请查看攻击是否成功(查询时间)。当日期改变时,遍历所有未处理的成功攻击并相应地更新隔离墙(每次攻击的更新时间)。-
我的问题是:是否有比更好的方法?也许,是否有某种战略方法可以利用部落的连续攻击的线性性质?20秒钟的时间对于预期的解决方案来说太长了(尽管Java可能是造成这种情况的原因)。