HDU-4219-Randomization?
题目描述
给定一棵\(n\)个节点的树,每条边的权值为\([0,L]\)之间的随机整数,求这棵树两点之间最长距离不超过\(S\)的概率。
Input
第一行三个整数\(n,L,S\)
接下来n-1行,每行两个整数,表示树上的一条边。
- \(1 <= T <= 512\)
- \(1 <= N <= 64\)
- \(1 <= L <= 8, 1 <= S <= 512\)
加强版:
- \(T=1\)
- \(1 <= N <= 100\)
- \(1 <= L <= 10, 1 <= S <= 2000\)
Output
输出树上任意两点距离都不超过\(S\)的概率,误差在\(10^{-6}\)以内都在算正确
Sample Input
3
2 3 2
1 2
4 3 4
1 2
2 3
3 4
7 4 10
1 2
2 3
4 5
2 6
4 7
4 6
Sample Output
Case 1: 0.750000
Case 2: 0.500000
Case 3: 0.624832
让我们先来考虑一下未加强的数据该怎么去写?
题目中树上两点最大距离就是树的直径。
因此,对于一个节点,我们需要维护信息是该节点到其子树的最大值的距离的概率。
同时,我们还要把儿子向父亲转移,即维护儿子到另一个儿子的距离的概率。
那么,我们就可以直接树形\(DP\)了。
\(dp[i][j]\)表示节点\(i\)到其子树的最大值为\(j\)的概率。
\(Dis[i]\)表示当前节点的子树到父亲的距离为\(i\)的概率。
\(temp[i]\)进行储存\(dp\)值,因为一个\(dp\)值会被多次利用。
总时间复杂度:\(O(n*S*(S+L))\)。
对于这个算法是无法过加强版的。
我们可以发现,这个\(dp\)的时间复杂度主要累积到\(temp\)值的累积上。
并且\(temp\)值的累积一定是连续的一段区间。
于是我们就可以利用前缀和优化,最后再把重复的给减掉。
时间复杂度:\(O(n*S*L)\)。
代码如下
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define u64 unsigned long long
#define reg register
#define Raed Read
#define debug(x) cerr<<#x<<" = "<<x<<endl;
#define rep(a,b,c) for(reg int a=(b),a##_end_=(c); a<=a##_end_; ++a)
#define ret(a,b,c) for(reg int a=(b),a##_end_=(c); a<a##_end_; ++a)
#define drep(a,b,c) for(reg int a=(b),a##_end_=(c); a>=a##_end_; --a)
#define erep(i,G,x) for(reg int i=(G).Head[x]; i; i=(G).Nxt[i])
inline int Read() {
int res = 0, f = 1;
char c;
while (c = getchar(), c < 48 || c > 57)if (c == '-')f = 0;
do res = (res << 3) + (res << 1) + (c ^ 48);
while (c = getchar(), c >= 48 && c <= 57);
return f ? res : -res;
}
template<class T>inline bool Min(T &a, T const&b) {
return a > b ? a = b, 1 : 0;
}
template<class T>inline bool Max(T &a, T const&b) {
return a < b ? a = b, 1 : 0;
}
const int N = 2e3+5, M = 1005, mod = 1e9 + 7;
bool MOP1;
int n,l,s,Case;
struct Link_list {
int Tot,Head[N],Nxt[M<<1],to[M<<1],cost[M<<1];
inline void Init(void) {
Tot=0;
memset(Head,0,sizeof Head);
}
inline void AddEdgepair(int a,int b) {
to[++Tot]=b,Nxt[Tot]=Head[a],Head[a]=Tot;
to[++Tot]=a,Nxt[Tot]=Head[b],Head[b]=Tot;
}
} G;
struct T290 {
double Dis[N],dp[N][N],temp[N];
void dfs(int x,int pre) {
rep(i,1,s)dp[x][i]=0;
dp[x][0]=1;
rep(j,0,s)Dis[j]=temp[j]=0;
erep(i,G,x) {
int y=G.to[i];
if(y==pre)continue;
dfs(y,x);
rep(j,0,s)Dis[j]=temp[j]=0;
rep(j,0,l)rep(k,0,s)if(j+k<=s)Dis[j+k]+=dp[y][k]*1.0/(l+1);
else break;
rep(j,0,s)rep(k,0,s-j)temp[max((int)k,(int)j)]+=dp[x][k]*Dis[j];
rep(j,0,s)dp[x][j]=temp[j];
}
}
inline void solve(void) {
ret(i,1,n) {
int a=Raed(),b=Read();
G.AddEdgepair(a,b);
}
dfs(1,0);
double Ans=0;
rep(i,0,s)Ans+=dp[1][i];
printf("Case %lld: %.6lf\n",++Case,Ans);
}
} Pbl;
struct T2100 {
double Dis[N],dp[N][N],temp[N],Sum1[N],Sum2[N];
void dfs(int x,int pre) {
rep(i,1,s)dp[x][i]=0;
dp[x][0]=1;
erep(i,G,x) {
int y=G.to[i];
if(y==pre)continue;
dfs(y,x);
rep(j,0,s)Dis[j]=temp[j]=0;
rep(j,0,l)rep(k,0,s)if(j+k<=s)Dis[j+k]+=dp[y][k]*1.0/(l+1);
else break;
Sum1[0]=dp[x][0];
Sum2[0]=Dis[0];
rep(i,1,s) {
Sum1[i]=Sum1[i-1]+dp[x][i];
Sum2[i]=Sum2[i-1]+Dis[i];
}
rep(j,0,s) {
int k=min(j,s-j);
temp[j]+=Sum1[k]*Dis[j];
}
rep(j,0,s) {
int k=min(j,s-j);
temp[j]+=Sum2[k]*dp[x][j];
}
rep(j,0,s)if(j*2<=s)temp[j]-=dp[x][j]*Dis[j];
rep(j,0,s)dp[x][j]=temp[j];
}
}
inline void solve(void) {
ret(i,1,n) {
int a=Raed(),b=Read();
G.AddEdgepair(a,b);
}
dfs(1,0);
double Ans=0;
rep(i,0,s)Ans+=dp[1][i];
printf("Case %lld: %.6lf\n",++Case,Ans);
}
} P100;
bool MOP2;
inline void _main(void) {
int T=Read();
while(T--) {
G.Init();
n=Raed(),l=Read(),s=Read();
P100.solve();
}
}
signed main() {
#define offline1
#ifdef offline
freopen("random.in", "r", stdin);
freopen("random.out", "w", stdout);
_main();
fclose(stdin);
fclose(stdout);
#else
_main();
#endif
return 0;
}
HDU-4219-Randomization?的更多相关文章
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
- hdu 4329
problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟 a. p(r)= R'/i rel(r)=(1||0) R ...
- HDU 2586
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:求最近祖先节点的权值和 思路:LCA Tarjan算法 #include <stdio.h&g ...
随机推荐
- 家谱(gen)x
家谱(gen) 时间限制 2S [问题描述] 现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先. [输入格式]gen.in 输入文件由多行组 ...
- 【CF963C】Cutting Rectangle(数论,构造,map)
题意: 思路:考虑构造最小的单位矩形然后平铺 单位矩形中每种矩形的数量可以根据比例算出来,为c[i]/d,其中d是所有c[i]的gcd,如果能构造成功答案即为d的因子个数 考虑如果要将两种矩形放在同一 ...
- jQuery_attr()操作
下面来介绍jQuery的属性attr()操作: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- (转载)rabbitmq与springboot的安装与集成
原文地址:https://segmentfault.com/a/1190000016991529 一.前言 RabbitMQ是一个开源的消息代理软件(面向消息的中间件),它的核心作用就是创建消息队列, ...
- R_Studio(癌症)数据连续属性离散化处理
对“癌症.csv”中的肾细胞癌组织内微血管数进行连续属性的等宽离散化处理(分为3类),并用宽值找替原来的值 癌症.csv setwd('D:\\data') list.files() dat=read ...
- 原生Js_实现简单的下拉折叠菜单(添加弹出动画效果)
用javascript实现简单的下拉折叠菜单效果 实现步骤 (a)获得各操作的dom对象: (b)在所有菜单按钮对象上添加单击事件: (c)设置所有菜单按钮样式为空,并将当前按钮的样式设置为“acti ...
- java命令--jstack 工具【转载】
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- React 开发中面临的九个重要抉择
抉择系列:在技术开发的过程中我们会面临着各种各样的抉择,我们在不同情境下该如何选择恰当的技术,这是本系列文章想要解决的问题. 在 React 开发的过程中我们常常会遇到一些抉择,下面我将选取其中一些个 ...
- 191028DjangoORM之多表操作
一.多表操作之一对多 models.py from django.db import models class Book(models.Model): name = models.CharField( ...
- Day1_Python基础一
一.基本认识 1.计算机基础 CPU:计算 内存:缓存 硬盘:存储 操作系统:硬件与软件的桥梁 应用程序:应用的平台 2.Python的历史 1989年龟叔,追求清晰.简单.优美的原则. 主要领域:云 ...