贪心的小on

赛时没想出来,一坨 T_T。

首先,我们需要明确什么样的区间满足“三角洲法则”。对于一个区间 \([l, r]\)\(a[l]\) 可以直接选,因为它左边没有方块。\(a[l+1]\) 需要满足 \(a[l+1] ≥ a[l]\)\(a[l+2]\) 需要满足 \(a[l+2] ≥ a[l] + a[l+1]\)。以此类推,\(a[i]\) 需要满足 \(a[i] ≥ sum(a[l..i-1])\)

这意味着,区间的和增长得非常快,因为每个后续元素必须至少等于前面所有元素的和。因此,满足条件的区间通常不会很长。

我们需要选择一些不相邻的区间,最大化总价值。这类似于经典的“不相邻子序列和”问题,但这里的子序列是满足“三角洲法则”的区间。

我们可以用动态规划来解决这个问题:

定义 \(dp[i]\) 表示前 \(i\) 个方块能获得的最大价值。
对于第 \(i\) 个方块,我们有两种选择:

  1. 不选 \(a[i]\),那么 \(dp[i] = dp[i-1]\)
  2. \(a[i]\),那么我们需要找到一个区间 \([j, i]\) 满足“三角洲法则”,并且 \(j\) 不能和之前选的区间相邻。此时 \(dp[i] = dp[j-2] + sum(a[j..i])\)(因为 \(j-1\) 不能选)。

然而,直接这样计算会非常耗时,因为我们需要检查所有可能的 \(j\)。我们需要优化。

对于一个满足“三角洲法则”的区间 \([j, i]\)\(a[j]\) 可以直接选。

  • \(a[j+1] ≥ a[j]\)
  • \(a[j+2] ≥ a[j] + a[j+1]\)
  • \(a[j+3] ≥ a[j] + a[j+1] + a[j+2]\)
  • ...
  • \(a[i] ≥ sum(a[j..i-1])\)

可以发现,这样的区间和增长得非常快,类似于斐波那契数列。因此,满足条件的区间长度通常不会很大(因为 \(a[i]\) 是指数级增长的,而 \(a[i]\) 的值是有限的)。

具体来说,对于一个区间 \([j, i]\),如果 \(sum(a[j..i])\) 超过了 \(10^9\),那么这样的区间就不可能继续扩展了(因为 \(a[i+1]\) 必须 \(≥ sum(a[j..i])\),而 \(a[i+1] ≤ 10^9\))。因此,满足条件的区间长度最多是 \(O(\log 10^9) ≈ 30\)

基于上述观察,我们可以优化动态规划:

  • 对于每个 \(i\),我们只需要检查最多 \(O(\log 10^9)\) 个可能的 \(j\)(即 \(i-1, i-2, ..., i-30\)),因为更远的 \(j\) 不可能满足 \(sum(a[j..i]) ≤ 10^9\)
  • 对于每个 \(j\),检查 \([j, i]\) 是否满足“三角洲法则”时,可以预处理前缀和 \(sum[j..i]\),并检查 \(a[k] ≥ sum[j..k-1]\) 对于所有 \(k ∈ [j+1, i]\)
  • 如果 \([j, i]\) 满足条件,那么 \(dp[i] = \max(dp[i], dp[j-2] + sum[j..i])\)(因为 \(j-1\) 不能选)。
  • 同时,\(dp[i]\) 也可以从 \(dp[i-1]\) 转移(不选 \(a[i]\))。
posted @ 2025-08-17 08:05  swate  阅读(16)  评论(0)    收藏  举报
body{ cursor: url(https://files.cnblogs.com/files/wkfvawl/cursor.ico),auto; }