[Procedure #18] CF2133F Flint and steel

[Procedure #18] CF2133F Flint and steel

from latest cf div2 [Start]

这个,好吧不是那道典题,这里的 creeper 是不能连锁引爆的,但是也不同于经典的选线段覆盖问题,因为 creeper 炸死就不能被选了。所以一些看起来直接的想法可能不对,原因在于它可能方案是比较复杂的。

好像也没有很复杂。不过确实有一个很大的问题,如图示情况

他能通过设 \(f_i\) 表示前 \(i\) 个已经被炸死的最小代价来求解吗?不可以!因为有时候就是要先做右边然后再做左边的(如上),所以顺序是不对的。所以我们必须保留关于使用的 creeper 的信息。那么,我们可以按直觉,保留最右边那个 creeper 吗?可以,不可能存在不和最右边那个互炸却和之前的互炸的可能性,容易通过分类讨论证明。

那么由于最优性,不会存在区间包含,最远炸到的位置就是最右边 creeper 的右端点,所以我们可以用只存最右边那个 creeper。

分类讨论:

  • \(j<i-e_i+1\le j+e_j-1\le i+e_i-1\)\(i\) 不会炸 \(j\)且保证不互相包含,否则可能导致非法转移,如 0 3 1 3 0 所示

  • \(i-e_i+1\le j+e_j-1<i\)\(j\) 不会炸 \(i\)

    \(\implies j\in [i-e_i-e_j+2,i-e_j]\)

满足上述任意一个条件都能转移。考虑线段树优化并扫描线。

考虑如何构造方案,我们这样能直接得到需要点燃哪些 creeper,但是顺序是不能得到的(因为只记录了最后一个 creeper),但是,如果按能力从小到大点燃他们,肯定合法。

[End]

posted @ 2025-09-01 21:50  haozexu  阅读(11)  评论(0)    收藏  举报