【ARC072F】 Dam 单调队列
题目大意:
有一个水库,容量为$L$,一开始是空的。有$n$天。
对于第i天,每天早上有$v_i$单位的,水温为$t_i$的水流进来。每天晚上你可以放掉一些水,多少自定。但是必须保证第二天水库不会溢出。
现在问,对于每个$i$,在使用最优放水策略的情况下,第$i$天水库是满的情况下最高水温($i$之间互相独立)。混合后的温度计算就和混合溶液浓度一样计算。
数据范围:$n≤10^5$,其它数$≤10^9$
由于这$n$天之间的方案是两两独立的,故在第$p$天之前,给第$p$天灌水的过程中,水库可不比灌满。
题目要求要在第$p$天注满整个水库,那么水库中显然会储有第$p$天前某些天注入的水。
我们不妨用一个关于水温的单调递增队列,存储下前$p$天的注水信息,这些水的体积恰好为$L$。
当第$p$天的水被注入前,我们要提前放掉一些水,显然我们要放掉最早加入,且水温最低的那批水(位于队头),删除方法详见代码。
对于第$p$天的注水$(V_p,T_p)$我们比较队尾的注水信息$(V_tail,T_tail)$,若存在$V_p>V_tail$那么我们直接将第$p$天的注水信息放到队列尾即可。
否则,我们就将第$p$天的注水与队尾的注水进行混合,用混合后的注水信息更新队尾,更新方法详见代码。
更新完毕后,$\frac{\sum_{i=head}^{tail} V_i}{L}$即为答案。
不难发现,每次注水的信息最多往单调队列中塞入一次,删除也是最多一次,故时间复杂度是$O(n)$。
#include<bits/stdc++.h>
#define M 500005
using namespace std;
struct node{double t,v;}q[M]={},p;
int head=,tail=;
int main(){
double l=,ll=,now=;
int n; scanf("%d",&n);
scanf("%lf",&ll); l=ll;
while(n--){
scanf("%lf%lf",&p.t,&p.v);
while(p.v>l){
if(q[head].v+l<=p.v)
now-=q[head].v*q[head].t,l+=q[head++].v;
else{
double x=p.v-l;
now-=x*q[head].t;
l+=x;
q[head].v-=x;
}
}
l-=p.v; now+=p.v*p.t; q[++tail]=p;
while(head<tail&&q[tail-].t>=q[tail].t){
q[tail-].t=(q[tail-].t*q[tail-].v+q[tail].t*q[tail].v)/(q[tail-].v+q[tail].v);
q[tail-].v+=q[tail].v;
tail--;
}
printf("%.10lf\n",now/ll);
}
}
【ARC072F】 Dam 单调队列的更多相关文章
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 【转】单调队列优化DP
转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
- hdu3530 单调队列
Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
随机推荐
- jquery报.live() is not a function的解决方法
jquery报.live() is not a function的解决方法: jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(. ...
- org.hibernate.HibernateException: /hibernate.cfg.xml not found等三个问题
初次配置hibernate在myeclipse上: 出现三个问题,怎么都不好使,比对代码,没有问题,查看路径还是没有问题: 1.org.hibernate.HibernateException: /h ...
- webservice大文件怎么传输
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- docker 命令介绍
查看镜像 docker images: 列出imagesdocker images -a :列出所有的images(包含历史)docker images --tree :显示镜像的所有层(layer) ...
- Android 3D游戏开发
OpenGL ES(OpenGL Embedded System) Android 3D游戏开发技术宝典:OpenGL ES 2.0(android 3d游戏开发技术宝典 -opengl es 2.0 ...
- SSH整合 第四篇 Spring的IoC和AOP
这篇主要是在整合Hibernate后,测试IoC和AOP的应用. 1.工程目录(SRC) 2.IoC 1).一个Service测试类 /* * 加入spring容器 */ private Applic ...
- (KMP)Seek the Name, Seek the Fame -- poj --2752
http://poj.org/problem?id=2752 Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536 ...
- inline函数的作用
(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...
- 【TypeScript】TypeScript 学习 4——模块
前端数据验证在改善用户体验上有很大作用,在学了之前的知识的时候,我们很可能会写出以下代码: interface StringValidator { isAcceptable(s: string): b ...
- Emmet常用语法
Emmet常用语法1.输入!和html:5(不能大写),按下TAB 键,快速生成一个 HTML5 的标准文档初始结构. html:xt 生成 HTML4 过渡型 html:4s 生成 HTML4 严格 ...