CF2029G Balanced Problem

题目大意:

有一个长度为 \(n\) 的数组 \(a\) 和一个长度为 \(n\) 的数组 \(c_{i}\),初始全都为 \(0\),有两种操作,一种是前缀加 \(1\),一种是后缀加 \(1\)
已经进行了 \(m\) 次操作(已给定),现在对于每个 \(1 \le v \le V\),在进行任意操作的情况下,求出

\[max(\sum_{i = 1}^{n} [a_{i} = v] \times c_{i}) \]

注意每次查询都是独立的。
\(n,m \le 2 \times 10^5, V \le 2000\)

解题思路:

是个很好的 \(dp\) 吧?
首先注意到 \(n\) 相对 \(V\) 来说是很大的,而且发现对于一段相同的 \(a_{i}\),他们最终也都是相同的,要么全都贡献答案,要么全都不贡献。
而我们做的是前缀后缀加的操作,这样值域 \(\le V\) 的段前后各有最多 \(V\) 个,拼在一块就是 \(O(V)\) 的,大概是 \(2V\)
现在 \(n\)\(4000\) 的范围了。

开始考虑他的条件,还是最经典的条件最优性问题,那么先简化条件。
先假设枚举了 \(v\),那么对于每个 \(a \le v\),将 \(a\) 变为 \(v - a\)
只需要判断每次前缀减后缀减能否恰好将序列变为 \(0\)

我一开始猜了个说 \(a_{i} \le \min_{j = 1}^{i} a_{j} + \min_{j=i}^{n} a_{j}\),但这很容易被 \(hack\),类似 \(1 2 1 2 1\)
所以以后猜结论可以先枚举检查一下。

由于加法是由交换律的,所以我们可以先做前缀加,然后再做后缀加,而我们后缀加能使得数组相等显然的充要条件为 \(a\) 不减。
那么我们就相当于要求差分数组全都大于等于 \(0\),且我们是单点加一。
也就是我们要满足

\[a_{1} \ge \sum_{i=1}^{n-1} \max(a_{i} - a_{i + 1}, 0) \]

注意到我们只需要管钦定贡献答案的位置并且可以通过整体加一来使得 \(v\) 能凑出来那 \(v+1\) 也能凑出来。
所以我们跑个 \(dp\),用 \(BIT\) 优化即可。
\(O(V^2 \log V)\).

posted @ 2026-01-26 23:49  positive_deviation  阅读(0)  评论(0)    收藏  举报