最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

Codeforces#282div1CHelpingPeople题解_html/css

来源:懂视网 责编:小采 时间:2020-11-27 15:59:42
文档

Codeforces#282div1CHelpingPeople题解_html/css

Codeforces#282div1CHelpingPeople题解_html/css_WEB-ITnose:CF 282 C Helping People 题解 【原题】不贴了。 【废话】好久没写博客了。(我不会告诉你我是离线写的)于是来水经验来了。 【来源简述】CF 282 C 【原题简述】有N(10^5)个人,每个人有初始的钱。再给出M(5000)个操作L,R,P。每次表示L~R这些
推荐度:
导读Codeforces#282div1CHelpingPeople题解_html/css_WEB-ITnose:CF 282 C Helping People 题解 【原题】不贴了。 【废话】好久没写博客了。(我不会告诉你我是离线写的)于是来水经验来了。 【来源简述】CF 282 C 【原题简述】有N(10^5)个人,每个人有初始的钱。再给出M(5000)个操作L,R,P。每次表示L~R这些

CF 282 C Helping People 题解

【原题】不贴了。

【废话】好久没写博客了。(我不会告诉你我是离线写的)于是来水经验来了。

【来源简述】CF 282 C

【原题简述】有N(10^5)个人,每个人有初始的钱。再给出M(5000)个操作L,R,P。每次表示L~R这些人有几率P(0<=P<=1)给他们每人一元。求最后所有人钱数最大值的期望。

【算法简述】首先把这些操作建立出树结构(可以借鉴线段树)。节点i表示范围Li~Ri,它的父亲一定包含它,它也包含它的所有子树。为了方便,建立一个L=1,R=N,P=0的无效节点作为根。

观察到M的范围小,我们用f[i][j]表示在节点i表示的范围内,加的钱数<=j的期望(注意原先的钱数可以用RMQ计算出)。至于为什么是<=,因为后面要用到前缀和??反正f算的时候再前缀和一下。那么到节点i,我们开一数组tmp[j]表示所有子树中影的最多(注意还是前缀和性质)加了j元的期望。

那么tmp[j]= ∏f[son][mx[i]+j-mx[son]];

mx[o]是原先区间o的最大钱数。

(这里就用到了f的前缀和性质了)

注意到求完后做一步tmp[j]-=tmp[j-1],取消前缀和性质。

然后我们的任务是求出i的所有f值。

那么ans[i][j]=ans[i][j-1]+tmp[j-1]*p[i]+tmp[j]*(1-p[i]);

ans[i][j-1]:前缀和

tmp[j-1]*p[i]:由子树中得最大加j-1,且当前也加

tmp[j]*(1-p[i]):由子树中得最大加j,且当前不加

求完了所有的f[i][j]后,我们对于新加的点K,最后的ans满足

ANS=ans[m][0]*mx[m]+Σ (ans[m][i]-ans[m][i-1])*(mx[m]+i);

【*精华所得】类似于分治的树形算法。

【代码】

#include#include#include#define N 100005#define M 5005using namespace std;struct arr{int l,r;double p;}a[M];int f[N][18],mx[N],used[N],n,i,j,T,m,k;double ans[M][M],tmp[M],ANS;inline int ask(int x,int y){ int len=(int)log2(y-x+1); return max(f[x][len],f[y-(1<=a[i].l&&a[j].r<=a[i].r&&!used[j]) { used[j]=1; for (k=0;k<=m;k++) if (mx[i]+k-mx[j]<=m) tmp[k]*=ans[j][mx[i]+k-mx[j]]; } for (k=m;k;k--) tmp[k]-=tmp[k-1]; ans[i][0]=(1-a[i].p)*tmp[0]; for (k=1;k<=m;k++) ans[i][k]=ans[i][k-1]+tmp[k-1]*a[i].p+tmp[k]*(1-a[i].p); //ans[i][k-1]:加上k-1的期望(ans[i]实质是前缀和性质) //tmp[k-1]*p[i]:由子树中得最大加k-1,且当前也加 //tmp[k]*(1-p[i]): 由子树中得最大加k,且当前不加 } ANS=ans[m][0]*mx[m]; for (i=1;i<=m;i++) ANS+=(ans[m][i]-ans[m][i-1])*(mx[m]+i); printf("%.10lf",ANS);}

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

Codeforces#282div1CHelpingPeople题解_html/css

Codeforces#282div1CHelpingPeople题解_html/css_WEB-ITnose:CF 282 C Helping People 题解 【原题】不贴了。 【废话】好久没写博客了。(我不会告诉你我是离线写的)于是来水经验来了。 【来源简述】CF 282 C 【原题简述】有N(10^5)个人,每个人有初始的钱。再给出M(5000)个操作L,R,P。每次表示L~R这些
推荐度:
标签: it div 题解
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top