CF494C Helping People 解题报告
CF494C Helping People
题意翻译
有一个长为 \(n\) 的数列,初始时为 \(a_{1\dots n}\)。
给你 \(q\) 个操作,第 \(i\) 个操作将 \([l_i,r_i]\) 内的数全部加一,有 \(p_i\) 的概率被执行。保证区间不会交错,即:\(\forall i,j\in[1,q],l_i\le r_i<l_j\le r_j\) 或 \(l_i\le l_j\le r_j\le r_i\) 或 \(l_j\le r_j<l_i\le r_i\) 或 \(l_j\le l_i\le r_i\le r_j\) 。
求操作完成后数列的最大值的期望。
输入格式
第一行 \(n,\,q\,(1\le n\le10^5,\,1\le q\le 5000)\)。
第二行 \(a_1,\,a_2,\,\cdots,\,a_n\,(0\le a_i\le10^9)\)。
接下来 \(q\) 行,每行 \(l_i,\,r_i,\,p_i\,(1\le l_i\le r_i\le n,\,0\le p_i\le1)\)。
输出格式
一个实数,表示答案,绝对/相对误差在 \(10^{-6}\)内算对。
Translated by ouuan.
考虑区间不交错的用处,一个区间向ta完全包含的区间连边,可以构成一棵树。
然后区间又只有5000个,搞一个\(n^2\)的树形dp多好
考虑求出每个最大值的概率。
令\(dp_{i,j}\)代表区间\(i\)最大值不大于\(j+\max_{l\le i\le r}a_i\)的概率,这样等于的概率只需要\(dp_{i,j}-dp_{i,j-1}\)就可以得到了
转移
\]
注意上下边界。
Code:
#include <cstdio>
#include <algorithm>
#define ls id<<1
#define rs id<<1|1
using std::max;
using std::min;
const int N=5010;
int head[N],to[N<<1],Next[N<<1],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int n,q;
struct node
{
int l,r,mx;double p;
bool friend operator <(node a,node b){return a.l==b.l?a.r>b.r:a.l<b.l;}
}s[N];
int mx[N*80];
void build(int id,int l,int r)
{
int mid=l+r>>1;
if(l^r) build(ls,l,mid),build(rs,mid+1,r),mx[id]=max(mx[ls],mx[rs]);
else scanf("%d",mx+id);
}
int query(int id,int L,int R,int l,int r)
{
if(l==L&&r==R) return mx[id];
int Mid=L+R>>1;
if(r<=Mid) return query(ls,L,Mid,l,r);
else if(l>Mid) return query(rs,Mid+1,R,l,r);
else return max(query(ls,L,Mid,l,Mid),query(rs,Mid+1,R,Mid+1,r));
}
int dep[N];
double dp[N][N];
void dfs(int now)
{
dep[now]=1;
for(int i=head[now];i;i=Next[i]) dfs(to[i]),dep[now]=max(dep[now],dep[to[i]]+1);
for(int j=0;j<=dep[now];j++)
{
double f1=j?s[now].p:0,f2=1-s[now].p;
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(j+s[now].mx-s[v].mx-1>=0) f1*=dp[v][min(q+1,j+s[now].mx-s[v].mx-1)];
f2*=dp[v][min(q+1,j+s[now].mx-s[v].mx)];
}
dp[now][j]=f1+f2;
}
for(int i=dep[now]+1;i<=q+1;i++) dp[now][i]=1;
}
int main()
{
scanf("%d%d",&n,&q);
build(1,1,n);
for(int i=1;i<=q;i++)
{
scanf("%d%d%lf",&s[i].l,&s[i].r,&s[i].p);
s[i].mx=query(1,1,n,s[i].l,s[i].r);
}
s[++q]={1,n,mx[1],0};
std::sort(s+1,s+1+q);
for(int i=2;i<=q;i++)
for(int j=i-1;j;j--)
if(s[j].l<=s[i].l&&s[i].r<=s[j].r)
{
add(j,i);
break;
}
dfs(1);
double x=s[1].mx,ans=dp[1][0]*x;
for(int i=1;i<=dep[1];i++)
ans+=(dp[1][i]-dp[1][i-1])*(x+i);
printf("%.6lf\n",ans);
return 0;
}
2019.1.13
CF494C Helping People 解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- Docker一键部署Hadoop心得(二)
今天在运行MapReduce程序时,虽然wordcount实例运行成功了,但后面出现了重新使用历史服务器失败的错误 17/12/22 13:33:19 INFO ipc.Client: Retryin ...
- [HAOI2008]排名系统 & [Zjoi2006]GameZ游戏排名系统 BZOJ1862&BZOJ1056
分析: 平衡树裸题,(学完LCT感觉自己不会普通的Splay了...),维护每个节点的权值大小顺序,和时间戳顺序,之后map维护一下是否存在过,(懒得写字符串hash了). 附上代码: #includ ...
- VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。
原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...
- KNN算法的R语言实现
近邻分类 简言之,就是将未标记的案例归类为与它们最近相似的.带有标记的案例所在的类. 应用领域: 1.计算机视觉:包含字符和面部识别等 2.推荐系统:推荐受众喜欢电影.美食和娱乐等 3.基因工程:识别 ...
- chrome浏览器插件 Octotree 让你浏览GitHub的时候像IDE 一样提供项目目录
GitHub 作为代码托管平台,竟然没有提供项目目录,方便用户在线快速浏览项目结构.所以,在线分析项目源码就会变得很繁琐,必须一层一层点击,然后再一次一次地向上返回.要知道,本来 GitHub 网站在 ...
- 《无所不能的JavaScript编程系列:setTimeout 简笔》
前言:问题引出 JavaScript中会经常用到setTimeout来推迟一个函数的执行,如: setTimeout(function(){alert("Hello World") ...
- 2014.8.23 Research Meeting Report
Dear All: It was good talk yesterday. However, I want to emphasize that, finally it is the *work* an ...
- 【URLOS应用开发基础】10分钟制作一个nginx静态网站环境应用
URLOS开发者功能已上线有一段时间了,目前通过部分开发者的使用体验来看,不得不说URLOS在服务器软件开发效率方面确实有着得天独厚的优势,凭借docker容器技术与其良好的应用生态环境,URLOS必 ...
- Linux_01
要安装centos系统,就必须得有centos系统软件安装程序,可以通过浏览器访问centos官网http://www.centos.org,然后找到Downloads - > mirror ...
- bugkuct部分writeup 持续更新
6307 校赛被打击到自闭,决心好好学习. web部分题目. 1.web2 地址 http://123.206.87.240:8002/web2/ 既然是第一个题我们应该采取查看源码的方式进行,右键之 ...