• 【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)$。

     1 #include<bits/stdc++.h>
     2 #define M 500005
     3 using namespace std;
     4 struct node{double t,v;}q[M]={0},p;
     5 int head=0,tail=0;
     6 int main(){
     7     double l=0,ll=0,now=0;
     8     int n; scanf("%d",&n);
     9     scanf("%lf",&ll); l=ll;
    10     while(n--){
    11         scanf("%lf%lf",&p.t,&p.v);
    12         while(p.v>l){
    13             if(q[head].v+l<=p.v)
    14             now-=q[head].v*q[head].t,l+=q[head++].v;
    15             else{
    16                 double x=p.v-l;
    17                 now-=x*q[head].t;
    18                 l+=x;
    19                 q[head].v-=x;
    20             }
    21         }
    22         l-=p.v; now+=p.v*p.t; q[++tail]=p;
    23         while(head<tail&&q[tail-1].t>=q[tail].t){
    24             q[tail-1].t=(q[tail-1].t*q[tail-1].v+q[tail].t*q[tail].v)/(q[tail-1].v+q[tail].v);
    25             q[tail-1].v+=q[tail].v;
    26             tail--;
    27         }
    28         printf("%.10lf
    ",now/ll);
    29     }
    30 }

     

  • 相关阅读:
    聊聊 API Gateway 和 Netflix Zuul
    现行统编中学数学教科书有多烂
    线程池的成长之路
    Quick Guide to Microservices with Spring Boot 2.0, Eureka and Spring Cloud
    以太坊、Hyperledger Fabric和Corda,哪个更好?
    【SFA官方翻译】Spring WebFlux和Spring Cloud进行响应式微服务开发
    goroutine背后的系统知识
    goroutine与调度器
    MySQL命令,一篇文章替你全部搞定
    微服务架构技术栈选型手册(万字长文)
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/9681513.html
Copyright © 2020-2023  润新知