CF596D Wilbur and Trees
题意:有一些高度为h的树在数轴上。每次选择剩下的树中最左边或是最右边的树推倒(各50%概率),往左倒有p的概率,往右倒1-p。
一棵树倒了,如果挨到的另一棵树与该数的距离严格小于h,那么它也会往同方向倒。
问所有树都被推倒后的期望覆盖长度?
n<=2000.
标程:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf=1e8+;
const int N=;
int pos[N],h,n,L[N],R[N];
double p,dp[N][N][][];
int check(int op,int x,int dir)
{
if (op==)
{
if (!dir) return min(pos[x]-pos[x-],h);
else return min(h,max(pos[x]-pos[x-]-h,));
}else {
if (!dir) return min(h,max(pos[x+]-pos[x]-h,));
else return min(pos[x+]-pos[x],h);
}
}
double dfs(int x,int y,int l,int r)
{
if (x>y) return ;
if (dp[x][y][l][r]) return dp[x][y][l][r];
double &ans=dp[x][y][l][r];
//choose left
ans+=0.5*p*(dfs(x+,y,,r)+check(,x,l));//fall left
if (R[x]+<=y) ans+=0.5*(-p)*(dfs(R[x]+,y,,r)+pos[R[x]]-pos[x]+h);//fall right
else ans+=0.5*(-p)*(pos[y]-pos[x]+check(,y,r));
//choose right
ans+=0.5*(-p)*(dfs(x,y-,l,)+check(,y,r));//fall right
if (x<=L[y]-) ans+=0.5*p*(dfs(x,L[y]-,l,)+pos[y]-pos[L[y]]+h);//fall left
else ans+=0.5*p*(pos[y]-pos[x]+check(,x,l));
return ans;
}
int main()
{
scanf("%d%d%lf",&n,&h,&p);
for (int i=;i<=n;i++) scanf("%d",&pos[i]);
sort(pos+,pos+n+);pos[]=pos[]-h;pos[n+]=pos[n]+h;
L[]=;R[n]=n;
for (int i=;i<=n;i++)
if (i==||pos[i]-pos[i-]<h) L[i]=L[i-];else L[i]=i;
for (int i=n-;i>=;i--)
if (i==n||pos[i+]-pos[i]<h) R[i]=R[i+];else R[i]=i;
printf("%.10lf\n",dfs(,n,,));
return ;
}
易错点:1.注意长度的判断。分类讨论。
2.需要设置极值端点,和1树、n树的距离要>=h。
题解:区间dp
剩下的一段树一定是连续的,区间dp即可。分四种情况讨论推导情况。
预处理一棵树往左/往右倒影响多少棵树。注意计算距离。
CF596D Wilbur and Trees的更多相关文章
- Codeforces Round #331 (Div. 2) D. Wilbur and Trees 记忆化搜索
D. Wilbur and Trees Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ...
- Codeforces 596D Wilbur and Trees
http://codeforces.com/contest/596/problem/D 题目大意: 有n棵树排成一排,高度都为h. 主人公要去砍树,每次等概率地随机选择没倒的树中最左边的树或者最右边的 ...
- Codeforces 596D Wilbur and Trees dp (看题解)
一直在考虑, 每一段的贡献, 没想到这个东西能直接dp..因为所有的h都是一样的. #include<bits/stdc++.h> #define LL long long #define ...
- codeforces 几道题目
BZOJ挂了....明天就要出发去GDKOI了....不能弃疗. 于是在cf水了几道题, 写写详(jian)细(dan)题解, 攒攒RP, 希望GDKOI能好好发挥....... 620E. New ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- hdu2848 Visible Trees (容斥原理)
题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...
- [LeetCode] Minimum Height Trees 最小高度树
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- [LeetCode] Unique Binary Search Trees II 独一无二的二叉搜索树之二
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
随机推荐
- FastText总结,fastText 源码分析
文本分类单层网络就够了.非线性的问题用多层的. fasttext有一个有监督的模式,但是模型等同于cbow,只是target变成了label而不是word. fastText有两个可说的地方:1 在w ...
- Spring源码由浅入深系列五 GetBean
获取bean的过程如上图所示.下一章将继续图示讲解createBean的过程.
- Invalid Rom
问题描述 原因说明 这多半是因为单片机超频被锁,就是HSE_VALUE设置的与实际值不一致,容易造成这个问题. 解放方法 1. 先正确配置 HSE_VLAUE, 看HSE_VALUE 修改问题. 2. ...
- 20140401 cudaHOG代码
1.cudaHOG代码(删减没有必要的目录) cudaHOGDetect需要boost库:boost_date_time-vc100-mt-1_40.lib VC++目录->附加库目录D:\bo ...
- vc面试题目
class B { public: B() { cout << "default constructor" << endl; } ~B() { cout & ...
- erlang 开发建议
* 确保没有任何编译警告 * Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针).因此string速度较慢,空间占用较大 * 在 ...
- SpringBoot 非web项目简单架构
1.截图 2.DemoService package com.github.weiwei02.springcloudtaskdemo; import org.springframework.beans ...
- MYSQL - 外键、约束、多表查询、子查询、视图、事务
MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...
- js--判断当前环境是否为app环境
/** *判断是否是app环境 */ function getIsApp () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/ ...
- AutoLayout(自动布局)入门
这是WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站,也许您会有兴趣通过RSS的方式订阅本站. AutoLayout在去年的WWDC上被引入Cocoa,而在今年的WW ...