AtCoder Grand Contest 072 F - Dam

17 篇文章 0 订阅
13 篇文章 0 订阅

Time limit : 3sec / Memory limit : 256MB

Score : 900 points

Problem Statement

You are in charge of controlling a dam. The dam can store at most L liters of water. Initially, the dam is empty. Some amount of water flows into the dam every morning, and any amount of water may be discharged every night, but this amount needs to be set so that no water overflows the dam the next morning.

It is known that vi liters of water at ti degrees Celsius will flow into the dam on the morning of the i-th day. You are wondering about the maximum possible temperature of water in the dam at noon of each day, under the condition that there needs to be exactly L liters of water in the dam at that time. For each i, find the maximum possible temperature of water in the dam at noon of the i-th day. Here, consider each maximization separately, that is, the amount of water discharged for the maximization of the temperature on the i-th day, may be different from the amount of water discharged for the maximization of the temperature on the j-th day (j≠i).

Also, assume that the temperature of water is not affected by anything but new water that flows into the dam. That is, when V1 liters of water at T1 degrees Celsius and V2 liters of water at T2 degrees Celsius are mixed together, they will become V1+V2 liters of water at T1*V1+T2*V2 V1+V2 degrees Celsius, and the volume and temperature of water are not affected by any other factors.

Constraints

1≤N≤5*105
1≤L≤109
0≤ti≤109(1≤i≤N)
1≤vi≤L(1≤i≤N)
v1=L
L, each ti and vi are integers.

Input

Input is given from Standard Input in the following format:

N L
t1 v1
t2 v2
:
tN vN

Output

Print N lines. The i-th line should contain the maximum temperature such that it is possible to store L liters of water at that temperature in the dam at noon of the i-th day.

Each of these values is accepted if the absolute or relative error is at most 10−6.

Sample Input 1

3 10
10 10
20 5
4 3

Sample Output 1

10.0000000
15.0000000
13.2000000
On the first day, the temperature of water in the dam is always 10 degrees: the temperature of the only water that flows into the dam on the first day.

10 liters of water at 15 degrees of Celsius can be stored on the second day, by discharging 5 liters of water on the night of the first day, and mix the remaining water with the water that flows into the dam on the second day.

10 liters of water at 13.2 degrees of Celsius can be stored on the third day, by discharging 8 liters of water on the night of the first day, and mix the remaining water with the water that flows into the dam on the second and third days.

Sample Input 2

4 15
0 15
2 5
3 6
4 4

Sample Output 2

0.0000000
0.6666667
1.8666667
2.9333333

Sample Input 3

4 15
1000000000 15
9 5
8 6
7 4

Sample Output 3

1000000000.0000000
666666669.6666666
400000005.0000000
293333338.8666667
Although the temperature of water may exceed 100 degrees Celsius, we assume that water does not vaporize.

Gist

  • 有一个容量为 L 的水库,N 天中每一天都有一定温度和体积的水流入水库。

  • 要求每天水库中的水的最高温度(每天相对独立,对于每次询问的那天水必须满)。

  • 为了每天流入的水不溢出,前一天晚上可以排出一些水。

  • 两股水温体积分别是 T1,V1 T2,V2 的水的混合后水温 T 满足关系:

    T=T1V1+T2V2V1+V2

  • 体积 V=V1+V2 ,且体积不受其他条件影响,水温可以超过 100 度。

  • 数据范围: 1N5105 1L,ti109 1viL v1=L

  • L,ti,vi 都是整数。

Solution

  • 考虑用单调队列维护当前水库里的水(贪心的思想)。

  • 从小到大存着每一股水,若水库不够大则队头开始排水,排到刚好能容下。

  • 接着把新加进来的水放到队尾,若比之前的水水温低则往前合并即可。

  • 注意记录一个当前水库的水的总温度,这样更方便统计答案。

  • 时间复杂度 O(N)

Code

#include<cstdio>
#include<cctype>
using namespace std;
const int N=5e5+5;
struct data
{
    double t;
    long long v;
}q[N],p;
int l=1,r=0;
inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int main()
{
    int n=read();
    long long L=read(),L0=L;
    double now=0;
    while(n--)
    {
        p.t=read(),p.v=read();
        while(p.v>L)
            if(q[l].v+L<=p.v)
            {
                now-=q[l].v*q[l].t;
                L+=q[l++].v;
            }else
            {
                long long x=p.v-L;
                now-=x*q[l].t;
                L+=x;
                q[l].v-=x;
            }
        L-=p.v;
        now+=p.v*p.t;
        q[++r]=p;
        while(l<r && q[r-1].t>=q[r].t)
        {
            q[r-1].t=(q[r-1].t*q[r-1].v+q[r].t*q[r].v)/(q[r-1].v*1.0+q[r].v);
            q[r-1].v+=q[r].v;
            r--;
        }
        printf("%.7lf\n",now*1.0/(L0-L));
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值