#include using namespace std; #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORD(i,a,b) for (int i = (a); i >= (b); i--) #define REP(i,b) for (int i = 0; i < (b); i++) typedef long long int ll; typedef long double ld; struct pool { ll speedmult; ld timefilled; ll id; ll nextId; ll prevId; }; bool operator<(const pool &a, const pool &b) { return a.timefilled < b.timefilled || (a.timefilled == b.timefilled && a.id < b.id); } pool pools[100001]; int main() { ll N, F; while(scanf("%lli %lli", &N, &F) == 2) { set s; REP(i, N) { ll cap; scanf("%lli", &cap); pools[i] = {1, ((ld)cap)/F, i, i+1, i-1}; s.insert(pools[i]); } ld curtime = 0; while(!s.empty()) { pool curpool = *s.begin(); s.erase(s.begin()); curtime = curpool.timefilled; if(curpool.id == N-1) { printf("%.8Lf ", curtime); } if(curpool.nextId != N) { s.erase(pools[curpool.nextId]); //printf("curtime: %Lf\n", curtime); //printf("pre: %Lf\n", pools[curpool.nextId].timefilled); ld oldtimeremain = pools[curpool.nextId].timefilled - curtime; //printf("oldtimeremain: %Lf\n", oldtimeremain); ll speed = pools[curpool.nextId].speedmult; //printf("speed: %lli\n", speed); //printf("nextspeed: %lli\n", speed + curpool.speedmult); ld newtimeremain = (oldtimeremain * speed * F) / ((speed + curpool.speedmult)*F); //printf("newtimeremain: %Lf\n", newtimeremain); pools[curpool.nextId].timefilled = curtime + newtimeremain; //printf("post: %Lf\n", pools[curpool.nextId].timefilled); pools[curpool.nextId].speedmult += curpool.speedmult; pools[curpool.nextId].prevId = curpool.prevId; s.insert(pools[curpool.nextId]); } if(curpool.prevId != -1) { s.erase(pools[curpool.prevId]); pools[curpool.prevId].nextId = curpool.nextId; s.insert(pools[curpool.prevId]); } } printf("%.8Lf\n", curtime); } return 0; } /* stack> s; REP(i, N) { ll cap; scanf("%i", &cap); ld tofill = cap, curtime = 0; ll speed = 1; //printf("C: %i ", cap); while(1) { ld timefilled = curtime + (tofill/(speed*F)); if(s.empty() || s.top().first >= timefilled) { if(i == N - 1) { printf("%.8Lf ", timefilled); if(s.empty()) { printf("%.8Lf", timefilled); break; } while(s.size() > 1) s.pop(); printf("%.8Lf", s.top().first); break; } s.emplace(timefilled, speed); //printf("tf: %Lf sp: %i\n", timefilled, speed); break; } ld nexttime = s.top().first; tofill -= (nexttime - curtime) * (speed * F); //printf("tofill: %Lf\n", tofill); speed += s.top().second; s.pop(); curtime = nexttime; } } */