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$)以及常数 $t_1, t_2, \dots, t_n$($1\le t_i\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, x_2, \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 954 E. Water Taps
http://codeforces.com/problemset/problem/954/E 式子变成Σ xi*(ti-T)=0 sum0表示>=T的ai*ti之和 sum1表示<T的ai ...
- Codeforces 343D Water Tree 分类: Brush Mode 2014-10-05 14:38 98人阅读 评论(0) 收藏
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
- CodeForces 343D water tree(树链剖分)
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- Codeforces 343D Water Tree
题意简述 维护一棵树,支持以下操作: 0 v:将以v为跟的子树赋值为1 1 v:将v到根节点的路径赋值为0 2 v:询问v的值 题解思路 树剖+珂朵莉树 代码 #include <set> ...
- Codeforces 343D Water Tree & 树链剖分教程
原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...
- Codeforces 1300E. Water Balance
给你一个数列,有一个操作,将一段数字变成其和除以个数,求字典序最小的那一个,分析知,求字典序最小,就是求一个不下降序列,但我们此时有可以更改数字的操作,已知已经不下降的序列不会因为操作而变的更小,只有 ...
- Educational Codeforces Round 40 (Rated for Div. 2) Solution
从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...
- Codeforces Educational Round 37
Solved CodeForces 920A Water The Garden Solved CodeForces 920B Tea Queue Solved CodeForces ...
随机推荐
- python基础一 day17 复习
# 迭代器# 生成器进阶 # 内置函数 # 55个 # 带key的 max min filter map sorted # 思维导图上红色和黄色方法必须会用 # 匿名函数 # lambda 参数,参数 ...
- MAC 设置登录欢迎语
MacdeMacBook-Pro:etc mac$ cd /etc MacdeMacBook-Pro:etc mac$ cat motd 技术沉淀,空杯心态! _______ _______ _ __ ...
- Java环境变量搭建(Linux环境)
1. 下载解压JDK压缩包 例如:解压到 /opt/jdk1.7.0_80 下 2. 添加环境变量到 /etc/profile 文件中 vi /etc/profile 在文件末尾追加如下内容: exp ...
- 第26题:LeetCode572:Subtree of Another Tree另一个树的子树
题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: ...
- linux下避免僵尸进程的几种方法
linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间.堆.栈......副本(采用写时复制机制),子进程将会继承父进程的信号掩码.信号处理方式.当前工作目录.会话id. ...
- vue入门之vue-cli安装项目
第一步先安装nmp 在node.js的官网下载即可. 第二步 直接安装刚下载好的node.js即可,(这里建议不要修改node.js的安装路径),傻瓜式直接下一步即可 检测是否安装成功: 在cmd的控 ...
- 二十七、MySQL 复制表
MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的. 本章节将为大家介绍如何完 ...
- [译]The Python Tutorial#7. Input and Output
[译]The Python Tutorial#Input and Output Python中有多种展示程序输出的方式:数据可以以人类可读的方式打印出来,也可以输出到文件中以后使用.本章节将会详细讨论 ...
- P1194 买礼物(建模)
P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只 ...
- 网络抢票黄牛,大部分是骗人的。公布一个骗钱黄牛,QQ:2233261390,QQ群:29443597,支付页面:https://me.alipay.com/q336
想着给女友买张回广州的回程火车票,抢了3天也没弄到.情急之下找了网络上所谓的黄牛.结果上当受骗.具体经过是这样的: 对方承诺抢到再付款.于是等他抢到后截图给我看,而且可以远程到他的机器去看,我也确实远 ...