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=T1∗V1+T2∗V2V1+V2 体积 V=V1+V2 ,且体积不受其他条件影响,水温可以超过 100 度。
数据范围: 1≤N≤5∗105 , 1≤L,ti≤109 , 1≤vi≤L , 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;
}