【luogu比赛】湿滑的地面

题目描述

从家到学校之间有n段路连成一条直线,每一段路有一个湿滑度si,表示走在这段路上就会有si的概率摔倒。由于雨下得比较大,所以政府也出动了不少人力减少道路的湿滑度。每次政府的操作可以表示成1 l r t,表示把区间[l,r]上所有道路的湿滑度乘以t。

但是小W还是很担心,因此他经常会询问你,在一个区间的道路上行走不摔倒的概率是多少。


输入

第一行两个正整数,为n,m,表示道路的数量以及操作的数量。

接下来1行有n个实数,为初始时道路的si。

接下来m行每行要么是1 l r t,表示把[l,r]中道路的湿滑度同时乘以t;要么是0 l r,表示询问从第l段路走到第r段路不摔倒的概率。


输出

对于每个询问操作,输出一行,表示不摔倒的概率。四舍五入到6位小数,你的输出必须和标准答案一模一样才可以得分。


样例输入

4 5
0.1 0.2 0.3 0.4
0 1 3
1 1 2 0.5
0 1 4
1 3 4 0.4
0 2 4


样例输出

0.504000
0.359100
0.665280



题解

 考虑如何计算结果。假定结果为

乘法不好计算,考虑取对数函数

注意到自然对数的泰勒展开式,我们有

根据题目的条件,我们会发现后面那个求和部分随j的增大迅速减小,而题目只要求保留到6位精度,因此j最大取到20已经足够了(当然,在考场上最好还是取稍微大一点把稳一点)。

于是我们可以开一棵线段树,每个节点上维护20个值,分别表示不同的 j 下的值。于是这道题就完美地解决了,复杂度O(20nlogn)

原文地址:https://www.cnblogs.com/rlddd/p/9540926.html