【AtCoder】【ARC072F】Dam

news/2024/7/6 1:10:47

Description

有一坐体积为m的水库,每天早上会有水流进来,晚上会放水,
每天流进来的水的温度和体积都可能不同,俩温度不同的水混合后的温度为: t1v1+t2v2v1+v2 t 1 ∗ v 1 + t 2 ∗ v 2 v 1 + v 2
假设水的温度不受其他因数影响,求第x天(x=1~n)中午水的温度最高多少(水库第x天的水必须是满的)。
当然要保证水库不会水太多爆炸。

Solution

如果每天流入的水的温度是递增的,那么显然是取最后m体积的水最优,
对于温度递增的入水,我们先放在一个队列中,不急着混合,
如果一个递增的入水队列,在放入了第i天的水后,温度不是递增的了,那么怎么办?
因为第i天的水是必须要全部流进水库的,我们可以把第i天的水和当前队列尾的水混合,如还不是递增的,就一直混合队尾的两个水,直到满足温度递增的条件,

这个显然是正确的(想不到,真的想不到)

复杂度: O(n) O ( n )

Code

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define JS(q,w) ((d[q][0]*d[q][1]+d[w][0]*d[w][1])/(d[q][0]+d[w][0]))
#define SM(q) (d[q][0]*d[q][1])
using namespace std;
typedef double db;
const int N=500500;
int read(int &n)
{
    char ch=' ';int q=0,w=1;
    for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());
    if(ch=='-')w=-1,ch=getchar();
    for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;
}
int m,n;
db ans;
db d[N][2];//v t
int main()
{
    int q,w;
    read(n),read(m);
    int l=1,r=0,all=0;
    fo(i,1,n)
    {
        read(q),read(w);
        d[++r][0]=w,d[r][1]=q;ans+=SM(r);
        all+=w;
        for(;l<r&&d[r-1][1]>=d[r][1];--r)
            if(d[r-1][0]+d[r][0]<=m)
            {
                ans-=SM(r)+SM(r-1);
                d[r-1][1]=JS(r-1,r),d[r-1][0]+=d[r][0];
                ans+=SM(r-1);
            }
            else 
            {
                l=--r;
                d[r][0]=m-d[r+1][0];
                d[r][1]=JS(r,r+1);
                d[r][0]=m;all=m;
                ans=SM(r);
                break;
            }
        for(;all>m;++l)if(all-d[l][0]>=m)ans-=SM(l),all-=d[l][0];
        else
        {
            ans-=SM(l);
            d[l][0]-=(all-m);
            ans+=SM(l);all=m;
            break;
        }   
        printf("%.10lf\n",ans/m);
    }
    return 0;
}

http://www.niftyadmin.cn/n/2675407.html

相关文章

SQL——实例记录(日期函数转换)

{转} 一般有以下几种转换方式&#xff0c;可根据实际需要选用&#xff1a; select Convert(varchar(10),getdate(),120)2006-05-12 select CONVERT(varchar, getdate(), 120 )2006-05-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),-,), ,),:…

springMVC:HandlerInterceptor拦截器的使用

2019独角兽企业重金招聘Python工程师标准>>> 1.使用背景 Web项目中需要判断http接口用户Post上来的数据是否合法&#xff0c;如果不合法要另做处理&#xff0c;用户Post上来的数据是Json形式的&#xff0c;我们用了RequestBody标记自动将json形式的提交封装为一个Mo…

【AtCoder】【ARC072E】Alice in linear land

Description 在数轴上有一个点&#xff0c;开始在原点&#xff0c;它要到位置T&#xff0c; 有一个操作序列&#xff0c;第i个元素为xixi&#xff0c;每次它会判断&#xff0c;如果它走了xixi个单位距离会离T更近&#xff0c;那么它就会走&#xff0c;否则原地不动&#xff0…

Web前端开发推荐书籍

Web前端开发推荐书籍 前言 学校里没有前端的课程&#xff0c;那如何学习JavaScript&#xff0c;又如何使自己成为一个合格的前端工程师呢&#xff1f; 读 书吧~相对于在网上学习&#xff0c;在项目中学习和跟着有经验的同事学习&#xff0c;书中有着相对完整的知识体系&#xf…

第 105 章 Ganglia

Ganglia是一个集群监控软件 Ganglia 是一个开源项目&#xff0c;它为高性能计算系统&#xff08;例如集群和网格&#xff09;提供了一个免费的可扩展分布式监视系统。 105.1. Server sudo apt-get install ganglia-monitor ganglia-webfrontendRestart apache2? 选择 Yessudo …

【UOJ 351】新年的叶子

Description 对于一棵树&#xff0c;每次随机染黑一个叶子&#xff08;可能会重复染黑&#xff09;&#xff0c;期望多少次后直径变小&#xff1f;. Solution 其实这题正确的题意应该是&#xff1a;对于每种直径与原图不同的染色方案&#xff0c;在第多少步时直径变小&#…

HTML新增布局标签

header&#xff1a; 标签定义文档的页眉&#xff0c;通常是一些引导和导航信息。它不局限于写在网页头部&#xff0c;也可以写在网页内容里面。 footer&#xff1a;作为页面的页脚时&#xff0c;一般包含了版权、相关文件和链接。 nav&#xff1a;是一个可以作为页面导航的链接…

桌面快捷方式的问题-创建-删除-判断

遇到了红米note1&#xff0c;我才知道了什么是开启一次应用创建一个创建一个快捷方式。 ………………………… 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 背景实现增加快捷方式删除快捷方式快捷方式修改快捷方式存在判断兼容与注…