【做题】arc072_f-Dam——维护下凸包
题意:有一个容量为\(L\)的水库,每天晚上可以放任意体积的水。每天早上会有一定温度和体积的水流入水库,且要保证流入水之后水的总体积不能超过\(L\)。令体积分别为\(V_1,V_2\),温度分别为\(t_1,t_2\)的水混合后的温度为\(\frac {V_1 * t_1 + V_2 * t_2} {V_1 + V_2}\)。初始水库为空。现给出\(n\)天流入水的体积和温度,分别最大化每一天中午水库满容量时的水温。
\(n <= 500000, \space L,t <= 10^9,\space V <= L\)
显然记录水温时直接记录温度和体积的乘积,这样混合时直接相加就可以了。这个混合满足结合律。
那么,我们可以把水表示为二维平面上的向量,\(x\)坐标为体积,\(y\)坐标为温度和体积的乘积。那么,温度就等于它的斜率。我们贪心一下,如果新加入的水导致水温下降,那么一定会在新加入水后再排水。否则,便可以在新加入水之前排水。这启发我们维护一个下凸包。如果某一天晚上是可以排水的,那么就不先与后面的水混合。否则便把两个向量相加。具体排水时放出斜率较小的水,流入水时不断与现有的水合并直到斜率大于之前的水为止。最大化第\(i+1\)天水的温度,就是最大化第\(i\)天放水后的水温,故我们直接从第\(i\)天的决策更新到第\(i+1\)天的决策,还可以保证新的决策时刻满足水的体积不超过\(L\)。
时间复杂度\(O(n)\)。
#include <bits/stdc++.h>
using namespace std;
const int N = 500010;
typedef double db;
const db eps = 1e-8;
inline int judge(db x) {
return x > -eps ? x > eps ? 1 : 0 : -1;
}
struct point {
db x,y;
point(db x_=0,db y_=0): x(x_), y(y_) {}
db operator * (const point& a) const {
return x * a.y - y * a.x;
}
point operator + (const point& a) const {
return point(x + a.x, y + a.y);
}
point operator - (const point& a) const {
return point(x - a.x, y - a.y);
}
void operator += (const point& a) {
*this = *this + a;
}
void operator -= (const point& a) {
*this = *this - a;
}
} q[N];
int n,cap,t,v,l=1,r;
point cur,tmp;
int main() {
scanf("%d%d",&n,&cap);
scanf("%d%d",&t,&v);
printf("%d.00000000\n",t);
q[++r] = point(v,1.0 * t * v);
cur += point(v,1.0 * t * v);
for (int i = 2 ; i <= n ; ++ i) {
scanf("%d%d",&t,&v);
db a = v;
while (judge(a - q[l].x) >= 0)
a -= q[l].x, cur -= q[l++];
cur -= q[l];
q[l].y *= (q[l].x - a) / q[l].x;
q[l].x -= a;
cur += q[l];
tmp = point(v,1.0 * t * v);
while (l <= r && judge(q[r] * tmp) <= 0)
tmp += q[r], cur -= q[r--];
if (judge(tmp.x - cap) > 0) {
tmp.y *= cap / tmp.x;
tmp.x = cap;
}
q[++r] = tmp;
cur += tmp;
printf("%.8lf\n",cur.y / cur.x);
}
return 0;
}
小结:在贪心的基础上维护下凸包(或单调队列),从而容易转移。感觉自己做起来还有难度。
【做题】arc072_f-Dam——维护下凸包的更多相关文章
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- SDOI2016 R1做题笔记
SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...
- AtCoder Grand Contest 11~17 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-11-to-20.html UPD(2018-11-16): ...
- AtCoder Grand Contest 1~10 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...
- HNOI2015做题笔记
HNOI2015 亚瑟王(概率DP) 根据期望的线性性,我们只需要算出每一种卡牌触发的概率就可以算出期望的值 考虑与第\(i\)张卡牌触发概率相关的量,除了\(p_i\)还有前\(i-1\)张卡牌中触 ...
- HNOI2014做题笔记
HNOI2014 世界树(虚树.倍增) \(\sum M \leq 3 \times 10^5\)虚树没得跑 对于所有重要点和它们的\(LCA\)建立虚树,然后计算出每一个虚树上的点被哪个重要点控制. ...
- LIS【p1704】寻找最优美做题曲线
Description 洛谷OJ刷题有个有趣的评测功能,就是系统自动绘制出用户的"做题曲线".所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第b[i]天AC了c ...
- LIS LCS LCIS (主要过一遍,重在做题)
只详细讲解LCS和LCIS,别的不讲-做题优先. 菜鸟能力有限写不了题解,可以留评论,我给你找博客. 先得理解最长上升子序列吧,那个HDOJ拦截导弹系列可以做一下,然后用o(n)log(n)的在做一遍 ...
随机推荐
- Abp项目构建、swagger及代码生成器
前段时间在学习abp,在配置swagger时踩了不少坑,特此整理一下,方便同行参考.幸运的是又发现了神奇的代码生成器,分享下亲身经验. 觉得此博客非常有用的朋友可以在右侧赞助打赏下,非常感谢大家支持. ...
- 《大话设计模式》c++实现 装饰者模式
一.UML图 介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...
- Java基础语法(三)
七.方法 定义: 方法就是完成特定功能的代码块 在很多语言里面都有函数的定义 函数在Java中被称为方法 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; ...
- Knowing is not enough; we must apply. Willing is not enough; we must do.
Knowing is not enough; we must apply. Willing is not enough; we must do. 仅限于知道是不够的,我们必须去实践:单纯的希望是不够的 ...
- 刨根究底字符编码之—UTF-16编码方式
在网上已经转悠好几天了, 这篇文章让我知道了UTF-16的前世今生, 感谢作者https://cloud.tencent.com/developer/article/1384687 1. UTF-16 ...
- iview的table中点击Icon弹Poptip,render函数的写法
render: (h, params) => { return h('div', [ h('div', [ h('Poptip', { props: { confirm: true, trans ...
- mybatis源码解析6---MappedStatement解析
MappedStatement类位于mybatis包的org.apache.ibatis.mapping目录下,是一个final类型也就是说实例化之后就不允许改变 MappedStatement对象对 ...
- LIS最长上升子序列三种方法 (模板)
O(n^)的方法: #include <iostream> #include <stdio.h> #include <cstring> #include <a ...
- github开源的一些ip解析 ,运营商信息,经纬度 地址 后续开发使用
https://github.com/wzhe06/ipdatabase ip解析 https://github.com/flyaction/ipdatabase 比较新 https://githu ...
- Linux shell 时间操作(取昨天 前天)
1. 取今天时间 $date -d "now" +%Y-%m-%d 2. 取昨天时间 $date -d "yesterday" +%Y-%m-%d $date ...