zoukankan      html  css  js  c++  java
  • 【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 }

     

  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/9681513.html
Copyright © 2011-2022 走看看