CF494C Helping People

梦里梦外; 2022-01-06 16:07 205阅读 0赞

http://codeforces.com/problemset/problem/494/C

题解

注意到区间之间没有交叉,所以只有包含的关系,我们可以把它整成一棵树。

然后设一下\(dp[i][j]\)表示以\(i\)为根的子树,最大值不超过区间最大值+\(j\)的概率。

转移:
\[ dp[u][j]=p*\prod dp[v][mx[u]-mx[v]-1+j]+(1-p)*\prod dp[v][mx[u]-mx[v]+j] \]

代码

  1. #include<bits/stdc++.h> #define N 100002 #define M 5002 using namespace std; typedef long long ll; int n,nw[N],top,mx[M],q,st[N]; vector<int>vec[N]; double f[M][M],ans,g[M][M]; int size[M]; inline ll rd(){ ll x=0;char c=getchar();bool f=0; while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x; } struct node{ int l,r;double p; inline bool operator <(const node &b)const{ if(l!=b.l)return l<b.l; else return r>b.r; } }a[M]; void dfs(int u){ int l=a[u].l; size[u]=u!=0; for(vector<int>::iterator it=vec[u].begin();it!=vec[u].end();++it){ int v=*it; dfs(v); for(int i=l;i<a[v].l;++i)mx[u]=max(mx[u],nw[i]); mx[u]=max(mx[u],mx[v]); l=a[v].r+1; } for(int i=l;i<=a[u].r;++i)mx[u]=max(mx[u],nw[i]); int now=mx[u]; for(vector<int>::iterator it=vec[u].begin();it!=vec[u].end();++it){ int v=*it; mx[u]=max(mx[u],mx[v]); } for(int i=0;i<=q;++i){ f[u][i]=(1-a[u].p); g[u][i]=a[u].p; } if(now==mx[u])g[u][0]=0; for(vector<int>::iterator it=vec[u].begin();it!=vec[u].end();++it){ int v=*it; size[u]+=size[v]; for(int j=0;j<=size[u];++j){ if(mx[u]-mx[v]-1+j<=size[u]&&mx[u]-mx[v]-1+j>=0)g[u][j]*=f[v][mx[u]-mx[v]-1+j]; if(mx[u]-mx[v]+j<=size[u])f[u][j]*=f[v][mx[u]-mx[v]+j]; } } for(int i=0;i<=q;++i)f[u][i]+=g[u][i]; } int main(){ n=rd();q=rd(); for(int i=1;i<=n;++i)nw[i]=rd(); for(int i=1;i<=q;++i){ a[i].l=rd();a[i].r=rd();scanf("%lf",&a[i].p); } sort(a+1,a+q+1); for(int i=1;i<=q;++i){ while(top&&a[st[top]].r<a[i].l)top--; vec[st[top]].push_back(i); st[++top]=i; } a[0].l=1;a[0].r=n; dfs(0); for(int i=0;i<=q;++i){ double x=i?f[0][i]-f[0][i-1]:f[0][0]; ans+=x*(mx[0]+i); } printf("%.9lf",ans); return 0; }

转载于:https://www.cnblogs.com/ZH-comld/p/11025327.html

发表评论

表情:
评论列表 (有 0 条评论,205人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CF1214C

    CF1214C 题意: > 给你一个括号序列,问你时候能仅移动相邻的两个元素,使括号序列合法。 解法: > 可以先考虑普通括号序列怎么做 > 这...

    相关 CF1200C

    CF1200C 题意: > 问内圆和外圆分别分成n、m份,每份有标号,问是否可以从一个部分走到另一个部分,12点钟位置一定有个线。 解法: > 如果...

    相关 CF1208C

    CF1208C > 这场杜老师大战tourist的比赛怎么这么多人类智慧题。。。 题意: > 构造一个 $ n \\times n $ 的矩阵,使得该矩阵...

    相关 CF280C

    CF280C > ZR补题计划 题意: > 一棵有根树,每次选择一个未删除的节点,然后删除它和它的子树内的点,问期望删多少次可以把整个树删完 解析: ...

    相关 cf 1179 C

    目录 A B C A 模拟出A不是最大值的情况,存起来。 最多有n个。当A为最大值的时候,后面n-1个数开始循环。 查询分两种情况讨论就行了