首先我们可以将 \(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. Codeforces 913C:Party Lemonade(贪心)

    C. Party Lemonade A New Year party is not a New Year party without lemonade! As usual, you are expec ...

  2. 如何改善win10录屏时声音降噪(消除杂音)

    此文章是针对win10系统中安装Realtek声卡的麦克风出现杂音的设置办法 1. 打开win10的控制面板,找到"硬件和声音选项" 2. 进入"硬件和声音"选 ...

  3. CLION 使用自己的makefile来运行

    之前参考过这里和这里,都是说要使用add_custom_target,无奈看不懂 但是前一篇里说它参考的是stackoverflow上的回答,去原帖里发现后来更新的第二高票答案!!!非常好用!!! 在 ...

  4. Drools集成SpringBootStarter

    1.说明 基于fast-drools-spring-boot-starter, 能够方便的将规则引擎Drools集成到Spring Boot, 基于前面介绍过的文章Drools集成SpringBoot ...

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

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

  6. Shell统计每个单词出现的个数

    题目链接 题目描述 写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数. 为了简单起见,你可以假设: nowcoder.txt只包括小写字母和空格. 每个单词只由小 ...

  7. react中antd+css Module一起使用

    antd 和 css modules 不能混用,针对antd的css 单独写一条loader的规则,不开启 css modules. 使用 exclude 和 include 配置参考(https:/ ...

  8. vue特效网站集锦

    1.17素材网 http://www.17sucai.com/pins/tag/7012.html

  9. 经典变长指令-RegOpcode

    一.回顾Mod/M结构 Intel 64 and IA-32 Architectures Instruction Format ModR/M结构图 Mod与R/M共同描述E的意义(内存或者通用寄存器) ...

  10. SYCOJ906瑞士轮

    题目-瑞士轮 (shiyancang.cn) 模拟题 #include<bits/stdc++.h> using namespace std; const int N=1e5+520; i ...