Codeforces 954E Water Taps

Posted Pat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 954E Water Taps相关的知识,希望对你有一定的参考价值。

题目大意

有 $n$($1\le n\le 200000$)个变量 $x_1, x_2, \dots, x_n$,满足
\begin{equation}
0\le x_i \le a_i \label{C:0}
\end{equation}
其中 $1\le a_i \le 10^6$,$a_i\in\mathbb Z$ 。

给定常数 $T$($1\le T\in\mathbb Z\le 10^6$),求解下述最优化问题
\begin{align}
\max \sum_{1\le i\le n} x_i\quad \mathrm{s.t.} \label{sum} \\
\frac{\sum_{1\le i\le n}x_it_i}{\sum_{1\le i\le n}x_i} = T \label{C:1}
\end{align}
若无解则输出 0 。

解法

比赛时我毫无思路,想不起来从前遇没遇到过类似的题目。

首先将 \eqref{C:1} 化为
\begin{equation}
\sum_{1\le i\le n} (t_i - T) x_i = 0 \label{C:2}
\end{equation}
将约束条件写成这种形式,保证了新问题与原问题完全等价。(换言之,包含了无解—即 \eqref{C:1} 无法满足—的情况)

下面的讨论都基于 \eqref{C:2} 式。

这个问题不必【也不可能?($n$ 太大)】用线性规划求解。
key observation 是

\eqref{C:2} 中的各项可以按系数 $t_i -T$ 的正负性分成两组分别考虑,二者是“无关”的。

具体而言,设
\begin{align}
S_+&=\sum_{t_i-T>0}(t_i-T) a_i \\
S_-&= \sum_{t_i - T < 0}(T-t_i) a_i \\
S_{\mathrm{min}} &= \min\{S_+\,, S_-\}
\end{align}
我们有

$\forall 0\le S \le S_{\mathrm{min}}$,$\exists x_1, x2, \dots, x_i, \dots, x_n$ 满足 \eqref{C:0} 且满足
\begin{align*}
\sum_{t_i -T > 0} (t_i - T) x_i = S \\
\sum_{t_i - T<0} (T-t_i) x_i = S
\end{align*}

不难看出,取 $S = S_{\mathrm{min}}$ 可使 \eqref{sum} 最大。
这题实际上是一道贪心问题。

推广

把 \eqref{C:1} 的分子分母中的 $x_i$ 都换成 $x_i^2$ 也是一样的做法。
但是若只把分母或分子中的 $x_i$ 换成 $x_i^2$ 改怎么做呢?

以上是关于Codeforces 954E Water Taps的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 343D Water Tree(DFS序+线段树+技巧)

Codeforces Round #576 (Div. 2) B - Water Lily

Codeforces 954 E. Water Taps

Codeforces 343D Water Tree

CodeForces 1299C Water Balance

343D/Codeforces Round #200 (Div. 1) D. Water Tree dfs序+数据结构