CF1923 挂分记

CF1923

A

弱智题,算一下最后一个 \(1\) 和第一个 \(1\) 之间有多少个 \(0\) 就可以了。

B

只需要判断对于每一个距离,在这个距离内的所有血量和是否 \(\le k \times\) 距离即可。

C

分两类讨论:

  • 长度为 \(1\),绝对不行;
  • 否则 令所有非 \(1\) 的为 \(1\),若剩下的和可以使每一个 \(1\) 都变成 \(2\) 或以上,就可以了。

D

考虑当前的是被左边的吃掉还是右边的吃掉。假设它被左边吃掉。

如果左边那个比它大,\(1\) 步即可。否则令 \(p_i\) 表示 \(i\) 左边第一个和 \(i\) 不同的坐标,没有则为 \(0\)

\(s_i\)\(\sum_{j=1}^ia_j\),则区间 \([j, i - 1]\) 能吃掉 \(i\) 的条件是:

  • \(j \le p_{i - 1}\)
  • \(s_{i - 1} - s_{j - 1} \gt a_i\)

对于第二个条件,可以转化为 \(s_{j - 1} \lt s_{i - 1} - a_i\)。因为 \(j\) 需要尽量大,也就是说 \(j\) 需要满足 \(s_j \ge s_{i - 1} - a_i\),二分即可。

E

不会树 /kk/kk

F

可以发现 shrink 顶多两次。

如果不 shrink,那就尽量把前面的空出来。

如果 shrink 一次,那就把后面尽量空出来。

如果 shrink 两次,双指针维护能达到的区间 \(l, r\),再二分(?)一下判断最后几个数是全 \(1\) 的。

赛时 \(1:58\) 想出来的,没写 /kk

posted @ 2024-02-24 12:24  cosf  阅读(22)  评论(0)    收藏  举报