题意:

对于一个序列a,构造一个序列b,使得两个序列,对于任意的区间 [l, r] 的区间最靠近左端点的那个最大值的位置,并且序列 b 满足 0 < bi < 1。

给定一个序列 a ,求序列 b 中所有元素的和的期望。

Sample Input
3
3
1 2 3
3
1 2 1
5
1 2 3 2 1 Sample Output
250000002
500000004
125000001

题解:

若满足题意,则 a 和 b 的笛卡尔树同构。

因为 bi 在 0 到 1 之间,故 bi 的期望值为 1/2 ,所以 b 序列的和的期望值为 n/2。
对于笛卡尔树的每一棵子树,若用sz[i]表示以 i 为根节点的子树的大小,则满足其根节点是子树的最大值的概率为 1/sz[i] 。

所以整棵树满足条件的概率为1 / Πsz[i]。

故总期望值为两个的乘积 n / 2Πsz[i]。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
typedef long long LL;
const int maxn = ;
const int MOD = 1e9+; int a[maxn], lson[maxn], rson[maxn], fa[maxn];
LL dp[maxn], inv[maxn];
LL tmp; LL DP(int id)
{
if (id == ) return ;
if (dp[id]) return dp[id];
dp[id] = DP(lson[id]) + DP(rson[id]) + ;
return dp[id];
} void getinv()
{
inv[] = ;
for (int i = ; i < maxn; i++)
inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
} int main()
{
int t, n;
scanf("%d", &t);
getinv();
for (int ca = ; ca <= t; ca++)
{
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]); stack<int> st;
for (int i = ; i <= n; i++)
lson[i] = rson[i] = fa[i] = dp[i] = ; for (int i = ; i <= n; i++)
{
if (!st.empty() && a[st.top()] < a[i])
{
while (!st.empty() && a[st.top()] < a[i])
tmp = st.top(), st.pop();
lson[i] = tmp, fa[tmp] = i;
}
if (!st.empty()) rson[st.top()] = i, fa[i] = st.top();
st.push(i);
} for (int i = ; i <= n; i++) if (!fa[i]) DP(i); LL ans = n * inv[] % MOD;
for (int i = ; i <= n; i++) ans = ans * inv[dp[i]] % MOD; printf("%lld\n", ans);
}
}

2018 Multi-University Training Contest 1 H - RMQ Similar Sequence(HDU - 6305 笛卡尔树)的更多相关文章

  1. [模板] 笛卡尔树 && RMQ

    话说我noip之前为什么要学这种东西... 简介 笛卡尔树(Cartesian Tree) 是一种二叉树, 且同时具有以下两种性质: 父亲节点的值大于/小于子节点的值; 中序遍历的结果为原序列. 笛卡 ...

  2. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  3. hdu 6305 RMQ Similar Sequence——概率方面的思路+笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6305 看题解,得知: 0~1内随机取实数,取到两个相同的数的概率是0,所以认为 b 序列是一个排列. 两个 ...

  4. 2016 Multi-University Training Contest 1 GCD RMQ+二分(预处理)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 题意:有N(N <= 100,000),之后有Q(Q <= 100,000)个区间查询[ ...

  5. 2018 Nowcoder Multi-University Training Contest 2

    目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...

  6. 2016 Al-Baath University Training Camp Contest-1 H

     Description You've possibly heard about 'The Endless River'. However, if not, we are introducing it ...

  7. 2018 Nowcoder Multi-University Training Contest 1

    Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...

  8. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  9. 2018 Nowcoder Multi-University Training Contest 10

    Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...

随机推荐

  1. C 碎片三 运算符与表达式

    一.算术运算符 算术运算符:+. -. *. /. %等 加:+ 减: - 乘: * 除: /     除数不能为0 模:%    参与模运算的数据不能为小数 二.赋值运算符 赋值运算符:= 作用: ...

  2. 11个炫酷的 Linux 终端命令

    我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. 1.命令行日常系快捷键 如下的快捷方式非常有用,能够 ...

  3. 添加egit插件

    1.下载egit插件 打开Eclipse,git需要eclipse授权,通过网页是无法下载egit的安装包的.在菜单栏依次打开eclipse→help→install new software→add ...

  4. linux nginx 404错误页面设置

    配置nginx 实现404错误 返回一个页面 1.配置nginx.conf 在http代码块 添加 fastcgi_intercept_errors on; 2.在网站的sever代码块 添加 err ...

  5. C# 发Domino邮件 报错误 Password or other security violation for database 的解决方案

    错误提示: Password or other security violation for database ******* 问题产生的描述: 之前C#发邮件是好的 加上了附件部分代码之后,出现了这 ...

  6. http请求各种数据的接受

    一.接受请求的http数据 1.接受客户请求的数据,例如xml数据格式,代码如下: 此代码相当于服务端 public String analyzeWeixinXMLStr(HttpServletReq ...

  7. JS中的异常exception

    js提供了一套异常处理机制.异常是干扰程序的正常流程的不寻常事故,当发生这样的事故时,你的程序应该抛出一个异常 try_it() { try { console.log(add("1&quo ...

  8. Android(java)学习笔记103:Framework运行环境之 Android进程产生过程

    1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...

  9. 高级vim 配置

    [root@chenbj ~]# pwd /root [root@chenbj ~]# cat .vimrc set nocompatible set pastetoggle=<F9> s ...

  10. python_20_列表

    #1 names=["QiZhiguang","DaiYang","HuZhongtao","ZhangDong"] p ...