【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 ...
随机推荐
- 2018.07.20 洛谷P4178 Tree(点分治)
传送门 又一道点分治. 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案. 代码如下: #include<bits/stdc++.h> #define N 40005 using ...
- 第一个Django应用
Django教程:http://www.liujiangblog.com/course/django/2 第一个Django应用 该应用包括以下两个部分: 一个可以让公众用户进行投票和查看投票结果的站 ...
- simpson法计算arctan(1)-即pi/4
对1/(1+x^2) 进行0到1的积分即使pi/4; 采用simpson方法 Func<double,double> func=(x)=>{ return 1/(1+ Math.Po ...
- Linux IPC之共享内存
System V共享内存机制: shmget shmat shmdt shmctl 原理及实现: system V IPC机制下的共享内存本质是一段特殊的内存区域,进程间需要共享的数据被放在该共 ...
- docker镜像基本操作
操作镜像 使用 docker 命令行操作 docker 镜像 获取镜像 使用「docker pull +镜像名称」从网络上下载image镜像 core@localhost ~ $ docker pul ...
- 一个简单的Linux后门程序的实现
该程序实质是一个简单的socket编程,在受害方上运行攻击代码(后门进程),通过socket打开一个预设端口,并监听,等待攻击方的链接.一旦攻击方通过网络链接工具试图链接该socket,那么后门进程立 ...
- 常用的SLAM解决方案
ORB SLAM 可以去Github上自己搜索现成的SLAM程序包 在此基础上做优化 视觉SLAM的分类方法:按摄像头的多少分为单目和双目,按是否使用概率方法分为概率法和图法 链接 学习SLAM重要的 ...
- PAT甲 1046. Shortest Distance (20) 2016-09-09 23:17 22人阅读 评论(0) 收藏
1046. Shortest Distance (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The ...
- hdu 1164 Eddy's research I
http://acm.hdu.edu.cn/showproblem.php?pid=1164 题意很简单,只是写代码的时候需要注意几个问题 一.筛选素数的时候记得用埃式筛选法,要是直接找可能会WA. ...
- Android 了解1G 2G 3G 知识
了解1G 2G 3G 相关知识,对网络通讯制式进行了解即可 1.这种网络通讯制式是一步一步发展起来的,由最开始的1G(最典型的手机,例如:大哥大,1G这种制式只能语音通话). 2.后来出现的2G,2G ...