\(\mathcal{Description}\)

  Link.

  给定序列 \(\{a_n\}\) 和 \(m\) 个操作,第 \(i\) 个操作有 \(p_i\) 的概率将 \([l_i,r_i]\) 内的元素 \(+1\)。且保证任意两个区间要么不交,要么有包含关系。求所有操作完成后序列最大值的期望。

  \(n\le10^5\),\(m\le5000\)。

\(\mathcal{Solution}\)

  首先应当知道,\(E(\max\{a_i\})\not=\max\{E(a_i)\}\)(不然还需要做嘛 qwq),这是由于每个数的期望值是不独立的。

  从题目奇怪的限制入手——各区间构成树形关系,整个序列上的区间构成一片森林。不妨加入第 \(m+1\) 个操作区间,满足 \(l_{m+1}=1,r_{m+1}=n,p_{m+1}=0\),区间就构成一棵严格的树了。

  考虑树上 DP,令 \(f(u,i)\) 表示操作完 \(u\) 子树内的所有操作后,区间最大值 \(\le i\) 的概率。同时注意到 \(m\) 相较于值域大小 \(10^9\) 非常小,所以很多数是不可能成为最大值的。记 \(u\) 子树所代表的区间内初始元素的最大值 \(mx_u\),不难发现仅有 \(k\in[mx_u,mx_u+m]\) 的 \(f(u,k)\) 有意义,而其余 \(f(u,k)\) 要不为 \(0\) 要不为 \(1\),没有记录的必要。那么状态就能优化为操作完 \(u\) 子树内的所有操作后,区间最大值 \(\le i+mx_u\) 的概率,并保证 \(i\in[0,m]\)。转移就简单了:

\[f(u,i)=p_i\prod_vf(v,mx_u-mx_v+i-1)+(1-p_i)\prod_vf(v,mx_u-mx_v+i)
\]

  注意单独计算 \(f(u,0)\),因为其前一项应取 \(0\)。

  复杂度 \(\mathcal O(n\log n+m^2)\)。(前一项为预处理 ST 表复杂度。)

\(\mathcal{Code}\)

#include <cstdio>
#include <vector>
#include <algorithm> const int MAXN = 1e5, MAXLG = 16, MAXM = 5000;
int n, m, mxa, a[MAXN + 5], lg[MAXN + 5], st[MAXN + 5][MAXLG + 5];
std::vector<int> tree[MAXM + 5];
double f[MAXM + 5][MAXM + 5]; inline void chkmax ( int& a, const int b ) { if ( a < b ) a = b; } inline int min_ ( const int a, const int b ) { return a < b ? a : b; } inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
} inline int qmax ( const int l, const int r ) {
int k = lg[r - l + 1], ret = st[l][k];
return chkmax ( ret, st[r - ( 1 << k ) + 1][k] ), ret;
} struct Section {
int l, r, mx; double p;
inline void read () {
l = rint (), r = rint (), mx = qmax ( l, r );
scanf ( "%lf", &p );
}
inline bool operator < ( const Section t ) const {
return l ^ t.l ? l < t.l : r > t.r;
}
} sec[MAXM + 5]; inline void solve ( const int u ) {
for ( int v: tree[u] ) solve ( v );
f[u][0] = 1 - sec[u].p;
for ( int v: tree[u] ) f[u][0] *= f[v][sec[u].mx - sec[v].mx];
for ( int i = 1; i <= m; ++ i ) {
double p = 1, q = 1;
for ( int v: tree[u] ) {
p *= f[v][min_ ( sec[u].mx + i - sec[v].mx - 1, m )];
q *= f[v][min_ ( sec[u].mx + i - sec[v].mx, m )];
}
f[u][i] = sec[u].p * p + ( 1 - sec[u].p ) * q;
}
} int main () {
n = rint (), m = rint ();
for ( int i = 1; i <= n; ++ i ) chkmax ( mxa, a[i] = st[i][0] = rint () );
for ( int i = 2; i <= n; ++ i ) lg[i] = lg[i >> 1] + 1;
for ( int j = 1; 1 << j <= n; ++ j ) {
for ( int i = 1; i + ( 1 << j ) - 1 <= n; ++ i ) {
chkmax ( st[i][j] = st[i][j - 1], st[i + ( 1 << j >> 1 )][j - 1] );
}
}
for ( int i = 1; i <= m; ++ i ) sec[i].read ();
sec[++ m] = { 1, n, qmax ( 1, n ), 0.0 };
std::sort ( sec + 1, sec + m + 1 );
for ( int i = 2; i <= m; ++ i ) {
for ( int j = i - 1; j; -- j ) {
if ( sec[j].l <= sec[i].l && sec[i].r <= sec[j].r ) {
tree[j].push_back ( i );
break;
}
}
}
solve ( 1 );
double ans = 0;
for ( int i = 0; i <= m; ++ i ) {
ans += ( i + mxa ) * ( f[1][i] - f[1][i - 1] );
}
printf ( "%.12f\n", ans );
return 0;
}

Solution -「CF 494C」Helping People的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  5. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  6. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

随机推荐

  1. spring cloud --- Feign --- 心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 什么是Feign? 为了简化我们的开发,Spring Cloud Fei ...

  2. 新增访客数量MR统计之NewInstallUserMapper相关准备

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  3. WAFW00F waf识别工具 源码学习

    我实习工作的第一个任务根据已有的java waf识别工具 实现了一个python的waf识别工具 代码结构非常乱 仅仅达到了能用的水平. 顶头svp推荐这个项目当时我已经写好了开始用了自己的 稍微看了 ...

  4. sql审核-避免离线sql导致的db集群故障

    关键词: sql审核.sql审批.sql检查.sql检测.sql执行 离线sql可能会导致的问题 首先,什么是离线sql呢?就是说手动触发执行的这种sql:相对的还有在线sql,位于我们的程序代码中, ...

  5. git和命令行 配置proxy请求

    GIT中的操作 设置全局代理 git config --global http.proxy socks5://127.0.0.1:8088 git config --global http.proxy ...

  6. Web开发之Cookie and Session

    会话 什么是会话? 简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话. 会话过程要解决什么问题 每个用户在使用浏览器与服务器进行会话的过程 ...

  7. dubbo系列十一、dubbo transport层记录

    前言 在dubbo接口方法重载且入参未显式指定序列化id导致ClassCastException分析时候用到了dubbo的通信层和编解码,dubbo有个transport层,默认使用netty4进行网 ...

  8. golang汇总gomodules的初始化与改变模块的依赖关系

    1. gomodules的初始化 2. 改变模块的依赖关系

  9. Druid未授权访问实战利用

    Druid未授权访问实战利用 ​ 最近身边的同学都开始挖src了,而且身边接触到的挖src的网友也是越来越多.作者也是在前几天开始了挖src之路.惊喜又遗憾的是第一次挖src就挖到了一家互联网公司的R ...

  10. python网络爬虫-数据储存(七)

    数据储存 主要介绍两种数据储存方法: 储存在文件中,包括text文件和csv文件 存储在数据库中,包括MySQL关系型数据库和mongoDB数据库 存储到txt title = "第一个文本 ...