一五做题记录

posted on 2024-05-01 07:33:52 | under | source

  • P5369 [PKUSC2018] 最大前缀和

状压 \(\rm dp\)。令 \(U\) 表示全集。

对于已确认的序列,考察其中一个前缀 \(S\),能否成为最大子段和,注意值相同算靠后的:

  1. 该前缀的所有真后缀(不包括自己)均 \(\ge0\)
  2. 剩余部分的所有前缀均 \(<0\)

不难发现两个限制互不影响。令 \(f_S\) 为由 \(S\) 组成的满足条件 \(1\) 的排列数量,\(g_S\) 为由 \(S\) 组成的满足条件 \(2\) 的排列数量。

\(ans=\sum\limits_{S=1}^{U} sum_S*f_S*g_{U-S}\)

转移是容易的,\(f\) 从前面加元素、\(g\) 从后面加元素。注意判定转移是否合法。

核心思想:枚举最大前缀和、将判定条件拆成两部分。

  • CF1699E Three Days Grace

首先,相同元素可以直接去掉。

考虑枚举左边界 \(i\)、确定右边界。令 \(f_{j}\) 表示 \(j\) 拆分后均 \(\ge i\) 的最小右边界。则 \(ans=\min\limits_i(\max\limits_{j\in A}(f_{i,j}))\)

从大到小枚举 \(i\),这是因为 \(\min\)\(\max\) 不易删除元素。

注意到一个重要性质:\(f_j\) 只会在 \(i\mid j\) 时改变。直接对 \(i\) 枚举其倍数 \(j\) 就好了,转移为 \(f_{j/i}\to f_j\),条件是 \(i*i\le j\)

转移复杂度是 \(m\) 的调和级数。考虑如何求 \(\max f_j\),由于 \(f_j\) 总是不升,所以直接对 \(\forall j\in A\) 开一个以 \(f_j\) 为值域的桶,发生修改就向下扫确定新的最大值。

核心思想:双指针(枚举一端得另一端)、倍数总个数较少、结合 \(\rm dp\) 数组值域分析。

  • CF1612F Armor and Weapons

注意任何时刻装备 \((a,b)\) 要满足 \(a\le n,b\le m\)

观察得到:

  1. 并不需要列表里的所有元素,只考虑盔甲和武器各自的最大值即可。

  2. 假定 \(n\le m\),可倍增构造 \(n\) 再不断凑出 \(m\),也就是说答案是 \(O(\log n+\frac mn)\) 的。

于是,考虑以答案、盔甲和武器的最大值为状态设计 \(\rm dp\)。令 \(f_{i,j}\) 表示答案为 \(i\)、盔甲为 \(j\) 时武器的最大值。

转移:

\(f_{i,j}\to f_{i+1,j+f_{i,j}+(j,f_{i,j})}\)

\(j+f_{i,j}+(j,f_{i,j})\to f_{i+1,j}\)

单次转移 \(O(n)\),总复杂度 \(O(n\log n+m)\)

posted @ 2026-01-15 08:20  Zwi  阅读(3)  评论(0)    收藏  举报