首先我们可以将 \(t_i \times v_i\) 看作一个整体,不妨令 \(x_i = v_i, y_i = t_i \times v_i\) 这样两堆水混合后相当于将两个维度相加,方便了计算。

那么在某一时刻,混合出来的水一定是由某些水的一部分所组成的,贪心地想:让温度更高的水占得尽可能多一定是更优的。

但是会存在一个问题,每天的水都必须全部倒进去,然后才能放水,这样温度低的水可能会拖累温度高的水。

但基于观察可以发现:

  • 如果当前倒进来的水比之前的水温更低,那么先将两者混合一定是更优的。

  • 否则为了保证之后能装水,一定是将之前的水先排出再排当前的水。

由此可以看出,每一时刻最优情况下混合的水温度一定是按时间单调递增的。

这很类似一个单调队列,那么我们可以考虑使用单调队列来维护这个单调递增的即将混合的水的序列。

每次进来这个时刻的水,因为先排放水温低的水是更优的,所以先需要把队首的水排出,直到恰好加入进来的水能放满水库。

那么此时的情况对于当前时刻就是最优的。

下面就需要基于上面的哪个观察来调整使得之后的情况也是更优的。

如果加入的水温度比队尾要高,直接加入即可。

否则,我们就一直将队尾与当前水混合直到当前水温比队尾高位置。

可以发现,这样满足了上面的两条调整策略。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 5e5 + 5;
double Sx, Sy, y[N];
int n, v, t, l, r, L, x[N], q[N];
int read() {
char c; int x = 0, f = 1;
c = getchar();
while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
signed main() {
n = read(), L = read();
rep(i, 1, n) t = read(), v = read(), x[i] = v, y[i] = v * t;
l = 1;
rep(i, 1, n) {
for (; l <= r && Sx + x[i] > L; ) {
if(x[q[l]] <= Sx + x[i] - L) Sx -= x[q[l]], Sy -= y[q[l]], ++l;
else {
Sy -= 1.0 * (Sx - (L - x[i])) / x[q[l]] * y[q[l]];
y[q[l]] = 1.0 * (x[q[l]] - (Sx - (L - x[i]))) / x[q[l]] * y[q[l]];
x[q[l]] -= Sx - (L - x[i]);
Sx = L - x[i];
}
}
for (; l <= r && y[q[r]] / x[q[r]] > y[i] / x[i]; --r)
y[i] += y[q[r]], x[i] += x[q[r]], Sx -= x[q[r]], Sy -= y[q[r]];
q[++r] = i, Sx += x[i], Sy += y[i];
printf("%.7f\n", Sy / Sx);
}
return 0;
}

可以发现,本题的精髓在于使用单调队列来模拟优化了两条贪心策略。

AT2402 [ARC072D] Dam的更多相关文章

  1. AT2402 Dam

    传送门 考虑到一个很显然的事实:水是逃不掉的,一定要接的 所以我们就可以得到一个结论:如果当前的水温比上次低,就混合起来(因为水是逃不掉的),如果高就保留(因为我可以将前面的全部抛弃,只取这个高的) ...

  2. 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用

    1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...

  3. DAM的使用结合串口和中断以及GPIO。

    DAM的使用结合串口和中断以及GPIO. 当我学到DMA这章的时候就意味着我已经学完了,GPIO里的LED,按键,还有就是串口发送数据. 那么下面就来总结下前段时间所学的知识(因为接下来有断时间我是没 ...

  4. 基于PaddlePaddle的语义匹配模型DAM,让聊天机器人实现完美回复 |

    来源商业新知网,原标题:让聊天机器人完美回复 | 基于PaddlePaddle的语义匹配模型DAM 语义匹配 语义匹配是NLP的一项重要应用.无论是问答系统.对话系统还是智能客服,都可以认为是问题和回 ...

  5. 直接IO 零拷贝 DAM 自缓存应用程序

    直接IO  零拷贝  DAM  自缓存应用程序

  6. Computer Graphics Principles And Practice (James Foley / Andries Van Dam / Morgan McGuire / David Sklar / James D. Foley 著)

    1 Introduction 2 Introduction to 2D Graphics Using WPF 3 An Ancient Renderer Made Modern 4 A 2D Grap ...

  7. 【ARC072F】 Dam 单调队列

    题目大意: 有一个水库,容量为$L$,一开始是空的.有$n$天. 对于第i天,每天早上有$v_i$单位的,水温为$t_i$的水流进来.每天晚上你可以放掉一些水,多少自定.但是必须保证第二天水库不会溢出 ...

  8. 【arc072f】AtCoder Regular Contest 072 F - Dam

    题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1 ...

  9. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

随机推荐

  1. 【机器学*】k*邻算法-01

    k临*算法(解决分类问题): 已知数据集,以及该数据对应类型 给出一个数据x,在已知数据集中选择最接*x的k条数据,根据这k条数据的类型判断x的类型 具体实现: from numpy import * ...

  2. 【微信小程序云开发】1分钟学会实现上传、下载、预览、删除图片,并且以九宫格展示图片

    大家好,我叫小秃僧 这篇文章是讲解云开发如何上传.下载.预览.删除图片,并且以九宫格展示图片的功能 @ 目录 1. 实现效果 2.JavaScript代码 3.wxml代码 4.wxss代码 1. 实 ...

  3. 《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-上篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  4. .NET 微服务——CI/CD(2):自动打包镜像

    准备工作 一.开启docker的tcp 我的服务器是linux,以端口2376为例,找到docker.service,在ExecStart下新增这段代码即可: -H tcp://0.0.0.0:237 ...

  5. Solr集群安装Version5.5.2(cloud模式)

    Solr安装cloud模式,基于Solr的安装版本为5.5.2. 安装规划 Solr IP/机器名 安装软件 运行进程 zdh-7 solr jar zdh-9 solr jar zookeeper ...

  6. 关于ActiveMQ+Zookeeper做集群时,解决启动报错:java.io.IOException: com/google/common/util/concurrent/internal/InternalFutureFailureAccess

    这个问题我也是无意间碰到的,之前一直是使用单机的ActiveMQ,所以也没这个问题,但是做集群时碰到这个问题,问题是这样子出现的: 首先,我准备了三台虚拟机,然后使用 Replicated Level ...

  7. MongoDB高级应用之数据转存与恢复(5)

    1.MongoDB索引 1.1.创建索引 db.books.ensureIndex{{number:1}} 创建索引同时指定索引的名字 db.books.ensureIndex({number:1}, ...

  8. Centos6.8安装并配置VNC

    一般服务器都会在IDC或云端,为了可以看到服务器的图形化界面,需要安装配置VNC,本例为Centos6.8上安装配置VNC. [root@hostname ~]#yum install -y tige ...

  9. Centos安装rrdtool的yum源

    由于centos的标准组件中是不带rrdtool的,因此我们需要添加一个dag的yum源,以安装rrdtool. 修改/etc/yum.repos.d/CentOS-Base.repo, #vi /e ...

  10. [STM32F4xx 学习] SPI与nRF24L01+的应用

    前面已经总结过STM32Fxx的特点和传输过程,下面以nRF24L01+ 2.4GHz无线收发器为例,来说明如何使用SPI. 一.nRF24L01+ 2.4GHz无线收发器的介绍 1. 主要特性 全球 ...