首先我们可以将 \(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. Java用sort实现对数组的降序排序

    在调用Arrays.sort()对数组进行排序时,默认是升序排序的,如果想让数组降序排序,有下面两种方法: 利用Collections的reverseOrder import java.util.*; ...

  2. Tomcat 组成与工作原理

    开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部分技术规范,比如 Java Servlet.Java Server ...

  3. Explain执行计划详解

    一.id id: :表示查询中执行select子句或者操作表的顺序,id的值越大,代表优先级越高,越先执行. id大致会出现 3种情况 二.select_type select_type:表示 sel ...

  4. Normalized Cuts and Image Segmentation

    目录 概 主要内容 求解 相似度 总的算法流程 skimage.future.graph.cut Shi J. and Malik J. Normalized cuts and image segme ...

  5. Unsupervised Feature Learning via Non-Parametric Instance Discrimination

    目录 概 主要内容 Wu Z., Xiong Y., Yu S. & Lin D. Unsupervised Feature Learning via Non-Parametric Insta ...

  6. Xcode Error returned in reply: Connection invalid

    当电脑上有Xcode两个版本是使用其中的某一个的Simulator时出现了这样的报错 在Preference->Location->Command Line Tool 选择 Xcode 9 ...

  7. IM2603设计资料 Type-C拓展坞电源管理芯片

    应用于Type-C拓展坞外围集成Buck变换器的电源管理芯片 IM2603 IM2603 概述 用于带有集成降压转换器的 Type-C 外围应用的电源管理 IC IM2603 是一款主要用于 Type ...

  8. partial write bypass PIE

    第一篇博客,请允许我水一下.BUUCTF上的一题:linkctf_2018.7_babypie 检查一下保护机制: 1 Arch: amd64-64-little 2 RELRO: Partial R ...

  9. GDB调试-从入门到实践

    你好,我是雨乐! 在上篇文章中,我们分析了线上coredump产生的原因,其中用到了coredump分析工具gdb,这几天一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工 ...

  10. Fuchsia OS入门官方文档

    Fuchsia Pink + Purple == Fuchsia (a new Operating System) Welcome to Fuchsia! This document has ever ...