Description

传送门

Solution

首先我们肯定不能那么耿直地直接把水混合起来吧。。不然分分钟完球。

那么怎么找到最优解呢?假如我们把水的体积和温度按顺序插入队列,这时我们插入第i天的水。假如这个时候水量超过了L,我们要把前面的部分水排掉。

我们目前有两种排水方法:

1.不断去掉队列的队首(即最开始插入队列的水)

2.选一个位置j,把队列中位置[1,j]的水量按照比例分别减少一部分(就是在第j个位置对应的当天倒掉一部分水)

普通的队列,无法比较方法1,2的优劣。我们考虑单调队列(队列中的水的温度保持单调递增)

由于我们的队列是单调的,显然第1种更优。

那么,插入了第i天的水后,还要确保队列的单调。设当前队列的队尾下标为r。

假如说第i天的水温比r的水温低,那么假如要放水,把i和r混合后放显然会比先放掉r的水再放i的水更优。所以我们把i和r混合起来。

如此直到队列恢复单调。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define _v first
#define _t second
using namespace std;
typedef long long ll;
pair<ll,double> q[];
int n,L,t,v;
int l=,r=;
ll pour,all_water=;double degree=;
int main()
{
scanf("%d%d",&n,&L);
for (int i=;i<=n;i++)
{
scanf("%d%d",&t,&v);
while (all_water+v>L)
{
pour=min(q[l]._v,all_water+v-L);
q[l]._v-=pour;
all_water-=pour;
degree-=q[l]._t*pour;
if (!q[l]._v) l++;
}
all_water+=v;degree+=1ll*t*v;
q[++r]=make_pair(v,t);
while (l<r&&q[r]._t<q[r-]._t)
{
q[r-]._t=(q[r]._t*q[r]._v+q[r-]._t*q[r-]._v)/(q[r]._v+q[r-]._v);
q[r-]._v+=q[r]._v;r--;
}
printf("%.7f\n",degree/L);
}
}

[arc072F]Dam-[单调队列]的更多相关文章

  1. 【ARC072F】 Dam 单调队列

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

  2. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  3. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  4. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  5. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

  6. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

    第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...

  7. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  8. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. 【转】单调队列优化DP

    转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...

  10. hdu3530 单调队列

    Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

随机推荐

  1. 使用 Azure CLI 创建 Linux 虚拟机

    Azure CLI 用于从命令行或脚本创建和管理 Azure 资源. 本指南详细介绍了如何使用 Azure CLI 部署运行 Ubuntu 服务器的虚拟机. 服务器部署以后,将创建 SSH 连接,并且 ...

  2. Oracle EBS 更新客户地点

    --更新客户地点 declare x_return_status ); x_msg_count NUMBER; x_msg_data ); x_profile_id NUMBER; l_locatio ...

  3. SQLServer SELECT @@IDENTITY 遇到的坑

    经常在写存储过程的时候获取当前插入后的ID都会用  @@IDENTITY 但是今天在用 @@IDENTITY的时候涉及到当前数据的插入会有insert触发器发生时,发现与实际插入的ID值对不上,网上查 ...

  4. AC自动机, 字符串匹配算法

    package utils import java.util.HashMapimport java.util.LinkedListimport util.control.Breaks._import ...

  5. FR共轭梯度法 matlab

    % FR共轭梯度法 function sixge x0=[1,0]'; [x,val,k]=frcg('fun','gfun',x0) end function f=fun(x) f=100*(x(1 ...

  6. angularjs-$location

    $location服务分析浏览器地址栏中的URL(基于window.location),让我们可以在应用中较为方便地使用URL里面的内容.在地址栏中更改URL,会响应到$location服务中,而在$ ...

  7. java内存分配策略

    对象的内存分配,从大方向将就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓存,将按线程优先在TLAB上分配. 1. 对象优先在Eden区分配:大多数情况下,对象在新生代Ed ...

  8. DevOps 解读

    本文为 转载文章, 非原创 DevOps DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化.运 ...

  9. 在不升级 mysql 的情况下直接使用 mysql utf8 存储 超过三个字节的 emoji 表情

    由于现在数据库的版本是5.5.2,但是看网上说要直接存储emoji表情,需要升级到5.5.3然后把字符集设置为utf8mb4,但是升级数据库感觉属于敏感操作. 考虑了多久之后直接考虑使用正则来替换,但 ...

  10. 论文笔记 Beyond Part Models: Person Retrieval with Refined Part Pooling_ECCV_2018

    1. 摘要 使用part-feature 能够起到更好的效果,不过这个需要我们很好地定位part的位置. 本文中作者集中考虑part内部的一致性,提出了 part-based convolutiona ...