题目链接:

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 ;
}

[jzoj 6087] [GDOI2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开+RMQ+精度)的更多相关文章

  1. [jzoj 6086] [GDOI2019模拟2019.3.26] 动态半平面交 解题报告 (set+线段树)

    题目链接: https://jzoj.net/senior/#main/show/6086 题目: 题解: 一群数字的最小公倍数就是对它们质因数集合中的每个质因数的指数取$max$然后相乘 这样的子树 ...

  2. [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)

    题目链接: https://jzoj.net/senior/#contest/show/2683/0 题目: 题解: 不妨枚举一个点,让两颗树都以这个点为根,求联通块要么点数为$0$,要么包括根(即联 ...

  3. [jzoj 6101] [GDOI2019模拟2019.4.2] Path 解题报告 (期望)

    题目链接: https://jzoj.net/senior/#main/show/6101 题目: 题解: 设$f_i$表示从节点$i$到节点$n$的期望时间,$f_n=0$ 最优策略就是如果从$i, ...

  4. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)

    题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...

  5. [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)

    题目链接: https://jzoj.net/senior/#main/show/6080 题目: 题意: 给定$n,m,u,v$ 设$t_i=ui+v$ 求$\sum_{k_1+k_2+...+k_ ...

  6. [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)

    题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...

  7. [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

    题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...

  8. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  9. [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)

    题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...

随机推荐

  1. mysql 免安装配置 数据库修改密码和远程IP登陆

    MySQL Windows安装包说明: 1.mysql-5.5.20-win32.msi:Windows 安装包,图形化的下一步下一步的安装. 2.mysql-5.5.20.zip,这个是window ...

  2. 【BZOJ 1878】 HH的项链

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1878 [算法] 显然,在线算法是不可做的,考虑离线算法 笔者的做法是莫队算法,时间复 ...

  3. [Tomcat]Tomcat安全设置

    1.关闭服务器端口:server.xml默认有下面一行: <Server port="8005" shutdown="SHUTDOWN"> 这样允许 ...

  4. electron-vue中使用iview 报错this. is readonly的解决办法

    title: electron-vue中使用iview 报错this. is readonly的解决办法 toc: false date: 2019-02-12 19:33:28 categories ...

  5. Activity、Fragment、ViewPage

    1.新建super //super提供统一的FragmentActivity入口.public abstract class SuperFragmentActivity extends Fragmen ...

  6. C#中显现串口通信SerialPort类

    SerialPort类的常用属性 名 称 说 明 BaseStream 获取 SerialPort 对象的基础 Stream 对象 BaudRate 获取或设置串行波特率 BreakState 获取或 ...

  7. 火狐浏览器下载文件中文乱码,文件名中的空格变加号("+")的问题

    解决一下问题: 1.火狐浏览器下载文件,中文变乱码 2.IE浏览器下载文件,丢失文件扩展名或强制扩展名为".txt" 3.浏览器下载文件,文件名中的空格变成加号("+&q ...

  8. Oracle 合并查询

    8).合并查询有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus.多用于数据量比较大的数据局库,运行速度快.1). ...

  9. Functional programming-函数式编程

    In computer science, functional programming is a programming paradigm—a style of building the struct ...

  10. LeetCode Golang 7. 整数反转

    7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. Tips : Math包给出的类型大小的边界: // Integer limit values. const ...