题目链接:

https://jzoj.net/senior/#main/show/6087

题目:

题解:

  • 只需要统计$\prod_{i=l}^r (1-\frac{a_i}{x})$
  • =$exp(\sum_{i=l}^r ln(1-\frac{a_i}{x}))(x>a_i)$
  • 我们可以把$ln(1-x)|x<1|$泰勒展开,得到$-\sum_{i=1}^{∞}\frac{x^i}{i}=0-\frac{x}{1}-\frac{x^2}{2}-\frac{x^3}{3}-...$
  • 那么里面化简得到$-\sum_{i=1}^{r} \sum_{j=1}^∞\frac{a_i^j}{x^j*j})=-\sum_{i=1}^∞\frac{1}{i*x^i}\sum_{j=l}^{r}a_j^i$
  • 实测$∞$取$50$就可以,预处理前缀和来快速计算$\sum_{j=l}^{r}a_j^i$
  • 注意把$x=x/max(a_i)$,$a_i=a_i/max(a_i)$,防止爆$double$的范围
  • 但是发现精度会有很大问题
  • 当$\frac{a_i}{x}$较大时,$ln$里面的东西会比较接近$0$,很难保证精度
  • 为$\frac{a_i}{x}$设置一个$lim$,当$\frac{a_i}{x}>lim$时直接算,再递归左右区间
  • $lim$取$0.5​$是可以过的
  • 寻找区间内最大的$\frac{a_i}{x}$用$RMQ$
  • 参考自大米饼大佬的博客

代码:

#include<bits/stdc++.h>
using namespace std;
typedef double db; const int N=6e5+;
const int M=;
int n,q;
int bin[],lg[N],f[N][];
db res;
db a[N],s[M+][N];
inline char gc()
{
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
inline int read()
{
char ch=gc();int s=;
while (ch<''||ch>'') ch=gc();
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=gc();}
return s;
}
int Max(int x,int y) {return a[x]>a[y]?x:y;}
void pre()
{
for (int i=bin[]=;i<=;bin[i]=bin[i-]<<,i++);
lg[]=-;
for (int i=;i<=n;i++) f[i][]=i,lg[i]=lg[i>>]+;
for (int i=;i<=;i++)
for (int j=;j+bin[i]-<=n;j++)
f[j][i]=Max(f[j][i-],f[j+bin[i-]][i-]);
}
int ask(int l,int r)
{
int t=lg[r-l+];
return Max(f[l][t],f[r-bin[t]+][t]);
}
db x;
db cal(int l,int r)
{
db re=,t=;
for (int i=;i<=M;i++)
{
t*=x;
re-=(s[i][r]-s[i][l-])/(i*t);
}
return exp(re);
}
void solve(int l,int r)
{
int mid=ask(l,r);
if (a[mid]/x<0.5) {res*=cal(l,r);return;}
res*=-a[mid]/x;
if (l<mid) solve(l,mid-);
if (r>mid) solve(mid+,r);
}
int main()
{
freopen("orz.in","r",stdin);
freopen("orz.out","w",stdout);
n=read();q=read();
db mx=;
for (int i=;i<=n;i++) a[i]=read(),mx=max(mx,a[i]);
for (int i=;i<=n;i++) a[i]/=mx;
pre();
for (int i=;i<=n;i++)
{
db t=;
for (int j=;j<=M;j++)
{
t*=a[i];
s[j][i]=s[j][i-]+t;
}
}
while (q--)
{
int l=read(),r=read();
x=read()/mx;
res=;solve(l,r);
printf("%.10f\n",-res);
}
return ;
}

最新文章

  1. Sql服务定时重启
  2. linux下缓存的查看/修改
  3. sdutoj 2609 A-Number and B-Number
  4. Python中reactor,factory,protocol
  5. HIP-HOP 漫画家 Skottie Young
  6. cmake编译win下64位obs
  7. 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
  8. Ubuntu设置环境变量的几种方法
  9. linux下安装apache最常见的报错解决
  10. redhat7 Samba
  11. Fabrik – 在浏览器中协作构建,可视化,设计神经网络
  12. Java中NIO和IO区别和适用场景
  13. C++获取MAC与IP
  14. 2016年蓝桥杯省赛A组c++第4题(算法填空)
  15. nGrinder Maven工程使用
  16. leetcode-algorithms-30 Substring with Concatenation of All Words
  17. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
  18. Java maven项目的小随笔
  19. OPENQUERY (Transact-SQL),跨数据库操作。
  20. windows server 2008 修改域的密码策略

热门文章

  1. listView 多个item布局
  2. SQL语句之Group By
  3. 【转】C# ABP WebApi与Swagger UI的集成
  4. 对ListView的Item子控件监听并跳转页面
  5. 「JavaSE 重新出发」05.01.01 equals 方法
  6. java导出excel通用方法
  7. 路飞学城Python-Day31
  8. vertical-align到底是个啥
  9. [置顶] Linux 常用命令集锦
  10. 关于npm警告fsevents和vue-cli项目中的一些问题,持续更新