【数学相关、规律】Codeforces 696B Puzzles

题目链接:

  http://codeforces.com/problemset/problem/696/B

题目大意:

  给一棵树,从根节点开始递归,time=1,每次递归等概率随机访问这个节点的子节点,走过不会再走,每访问到一个新节点time+1,求访问每个节点的时间的期望。

题目思路:

  【数学规律】

  这题其实是一道概率DP的题目,但是找规律后发现答案和当前结点的子树大小有关。

  ans[v]=ans[u]+1+0.5*(child[u]-child[v]-1),child为当前节点的子树大小。

  1 //
  2 //by coolxxx
  3 ////<bits/stdc++.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<memory.h>
  9 #include<time.h>
 10 #include<stdio.h>
 11 #include<stdlib.h>
 12 #include<string.h>
 13 //#include<stdbool.h>
 14 #include<math.h>
 15 #define min(a,b) ((a)<(b)?(a):(b))
 16 #define max(a,b) ((a)>(b)?(a):(b))
 17 #define abs(a) ((a)>0?(a):(-(a)))
 18 #define lowbit(a) (a&(-a))
 19 #define sqr(a) ((a)*(a))
 20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
 21 #define mem(a,b) memset(a,b,sizeof(a))
 22 #define eps (1e-8)
 23 #define J 10
 24 #define MAX 0x7f7f7f7f
 25 #define PI 3.14159265358979323
 26 #define N 100004
 27 using namespace std;
 28 typedef long long LL;
 29 int cas,cass;
 30 int n,m,lll,ans;
 31 int fa[N],s[N],last[N];
 32 double c[N];
 33 struct xxx
 34 {
 35     int next,to;
 36 }a[N];
 37 void add(int x,int y)
 38 {
 39     a[++lll].next=last[x];
 40     a[lll].to=y;
 41     last[x]=lll;
 42 }
 43 void cal(int u)
 44 {
 45     int i,v;
 46     for(i=last[u];i;i=a[i].next)
 47     {
 48         v=a[i].to;
 49         cal(v);
 50         s[u]+=s[v];
 51     }
 52     s[u]++;
 53 }
 54 void dfs(int u)
 55 {
 56     int i,v;
 57     for(i=last[u];i;i=a[i].next)
 58     {
 59         v=a[i].to;
 60         c[v]=c[u]+(s[u]-s[v]-1)*0.5+1;
 61         dfs(v);
 62     }
 63 }
 64 void print()
 65 {
 66     int i;
 67     for(i=1;i<=n;i++)
 68     {
 69         printf("%d ",s[i]);
 70     }
 71     puts("");
 72 }
 73 int main()
 74 {
 75     #ifndef ONLINE_JUDGE
 76     freopen("1.txt","r",stdin);
 77 //    freopen("2.txt","w",stdout);
 78     #endif
 79     int i,j;
 80 //    for(scanf("%d",&cas);cas;cas--)
 81 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
 82 //    while(~scanf("%s",s))
 83     while(~scanf("%d",&n))
 84     {
 85         mem(s,0);mem(last,0);lll=0;
 86         for(i=2;i<=n;i++)
 87         {
 88             scanf("%d",&fa[i]);
 89             add(fa[i],i);
 90         }
 91         cal(1);
 92         c[1]=1.0;
 93         dfs(1);
 94         for(i=1;i<=n;i++)
 95             printf("%.1lf ",c[i]);
 96         puts("");
 97     }
 98     return 0;
 99 }
100 /*
101 //
102
103 //
104 */

时间: 2024-08-15 16:21:48

【数学相关、规律】Codeforces 696B Puzzles的相关文章

CodeForces 696B Puzzles

思维,简单树$dp$. 首先计算出每一个子树包含多少个节点,记为$f[i]$.然后就可以从$root$开始推出所有节点的期望了. 现在已知$fa$节点的答案为$ans[fa]$,假设要计算$fa$的一个儿子$v$的期望,那么$ans[v]=ans[fa]+1.0+(f[fa]-f[v]-1)/2.0$. 我画了一下样例,然后猜测了一下发现是对的...... #pragma comment(linker, "/STACK:1024000000,1024000000") #include&

Python学习笔记17:标准库之数学相关(math包,random包)

前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math.ceil(x)       # 对x向上取整.比方x=1.2,返回2 math.floor(x)      # 对x向下取整.比方x=1.2,返回1 math.pow(x,y)      # 指数运算.得到x的y次方 math.log(x)        # 对数.默认基底为e.能够使用base參

Python学习笔记17:标准库之数学相关(之math包,random包)

前面几节看得真心累,现在先来点简单容易理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math.ceil(x)       # 对x向上取整,比如x=1.2,返回2 math.floor(x)      # 对x向下取整,比如x=1.2,返回1 math.pow(x,y)      # 指数运算,得到x的y次方 math.log(x)        # 对数,默认基底为e.可以使用base参数,

【3D研发笔记】之【数学相关】(一):坐标系

现在开始学习3D基础相关的知识,本系列的数学相关笔记是基于阅读书籍<3D数学基础:图形与游戏开发>而来,实现代码使用AS3,项目地址是:https://github.com/hammerc/hammerc-Snake3D-as3与https://github.com/hammerc/hammerc-Snake3D-as3-examples,而3D类库代码则是模仿Away3D的设计来编写的,实现上尽可能模仿Away3D,部分修改的地方学习笔记中会进行特别说明. 言归正传,先看看2D方面,对于2D

三、Java基础工具(1)_常用类——数学相关类

2018-05-13 数学相关类 一.Math类 Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数.对数.平方根和三角函数.   Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用 参考:https://blog.csdn.net/tomorrowtodie/article/details/52590688 ---------------------------------------------------------------

java.util.Math类--数学相关的工具类

Math类--数学相关的工具类 java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. public static double abs(double num);获取绝对值.有多种重载: public static double ceil(double num);向上取整. public static double floor(double num);向下取整. public static long round(double num);四舍五入.

数学/找规律/暴力 Codeforces Round #306 (Div. 2) C. Divisibility by Eight

题目传送门 1 /* 2 数学/暴力:只要一个数的最后三位能被8整除,那么它就是答案:用到sprintf把数字转移成字符读入 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <iostream> 8 #include <cmath> 9 #include <vector> 10 using namespace std; 11

【codeforces 696B】 Puzzles

http://codeforces.com/problemset/problem/696/B (题目链接) 题意 给出一棵树,随机dfs遍历这棵树,求解每个节点的期望dfs序. Solution 考虑对于节点u,其某个儿子节点v的期望是多少. 首先,节点u的儿子的dfs的顺序是其儿子数son[x]的全排列.考虑在排列中有多少个节点在v的前面,不妨设x排在v的前面,那么满足的排列数为:${P_n^{n-2}}$,于是x对v的期望的贡献为:$${\frac{P_n^{n-2}×size[x]} {P

【转载】【树形DP】【数学期望】Codeforces Round #362 (Div. 2) D.Puzzles

期望计算的套路: 1.定义:算出所有测试值的和,除以测试次数. 2.定义:算出所有值出现的概率与其乘积之和. 3.用前一步的期望,加上两者的期望距离,递推出来. 题意: 一个树,dfs遍历子树的顺序是随机的.所对应的子树的dfs序也会不同.输出每个节点的dfs序的期望   思路: 分析一颗子树: 当前已知节点1的期望为1.0 ->anw[1]=1.0 需要通过节点1递推出节点2.4.5的期望值 1的儿子分别是2.4.5,那么dfs序所有可能的排列是6种: 1:1-2-4-5  (2.4.5节点的