首页 > 其他分享 >[数学记录]P1232 树的计数

[数学记录]P1232 树的计数

时间:2022-12-11 13:00:17浏览次数:51  
标签:int pos dfs 计数 分层 dfn 数学 P1232 节点

题意:

给出一棵树的 dfs 序和 bfs 序,求所有可能的原树的高度平均值

\(n \leq 2 \cdot 10^5\)

首先把 bfs 序变成 \(1 \to n\),这样就需要把原树上的节点分成若干层。

设 \(pos_{dfn_i}=i\),\(dfn\) 数组存点性质,\(pos\) 数组存点编号。

注意到每个节点是否分层对答案的贡献独立,单独求出每个节点是否能分层即可。

首先处理分层对 dfs 序的限制:当 \(dfn_x > dfn_{x+1}\) 时,\(x\) 与 \(x+1\) 间必须分层。

现在研究一棵树的 dfs 序应该满足什么条件。

思考做 dfs 的过程,每一步可以回溯或进入一个子节点。

借张图,图源 link

dfs 的每一步可以回溯或往下走到子节点。因为有换层出现,\(3\) 中的换层已经被计算,现在要把 \(3\) 筛选出来。

第一种情况 \(pos_y = pos_x+1\),第二种情况 \(pos_y < pox_x\),所以当 \(pos_y>pos_x+1\) 时一定属于第三种情况。

因此获得了两个限制:\(dfn_x > dfn_{x+1}\) 时 \(x\) 必须分层,\(pos_y>pos_x+1\) 时 \(x\) 与 \(y\) 之间不能再分层。

#include <cstdio>
using namespace std;
const int M = 2e5 + 5;
int read(){
    int x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
    return x * f;
}
int n, bfs[M], pos[M], dfs[M], dif[M], dfn[M];
void solve(int l, int r) {++dif[l]; --dif[r+1];}
int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) dfn[read()] = i;
    for(int i = 1; i <= n; i++) pos[dfn[read()]] = i;
    for(int i = 1; i <= n; i++) dfn[pos[i]] = i;
    solve(1, 1);
    double ans = 1;
    for(int i = 1; i < n; i++) {
        if(pos[i] < pos[i+1] - 1) solve(pos[i], pos[i+1] - 1);
        if(dfn[i] > dfn[i+1]) ++ans, solve(i, i);
    }
    int t = 0;
    for(int i = 1; i < n; i++) {
        t += dif[i];
        ans += t ? 0 : 0.5;
    }
    printf("%.3lf\n", ans+1);
}

标签:int,pos,dfs,计数,分层,dfn,数学,P1232,节点
From: https://www.cnblogs.com/purplevine/p/16973507.html

相关文章

  • Math常用的数学运算(包括取整、取绝对值、保留几位小数等)
    返回两个数的最大值(支持intlongfloatdouble)System.out.println(Math.max(1,2));返回两个数的最小值(支持intlongfloatdouble)System.out.println(Math.min(1,2));......
  • 数学要素开源书籍
    生姜的<<数学要素>>书籍,内容和版面都非常精美​​https://github.com/Visualize-ML/Book3_Elements-of-Mathematics​​​生姜的视频​​https://space.bilibili.com/......
  • excel科学计数法转换成文本完整显示
    1、首先打开含有科学计数法显示的excel;2、在excel最上面的菜单栏点击数据,找到“分列”选项;3、点击“分列“选项,进入分列向导,采用默认选项;4、点击下一步,还是采用默认选项......
  • 2023-王谱三套卷-数学一
    2023-王谱3-1T3\(f(x)>0,\,f^{''}(x)f(x)-[f^{'}(x)]^2>0\),则\(\dfrac{f^{'}(x)}{f(x)}\)单调增,\(\lnf(x)\)为凹函数T4当\(x\rightarrow\dfrac\pi2^-\)时,\(\tan^......
  • 算法学习笔记(40)——组合计数
    组合计数组合计数求组合数I——预处理组合数求组合数II——预处理阶乘求组合数III——卢卡斯定理(Lucas)求组合数IV——高精度满足条件的01序列——卡......
  • 数学吧 《8u
    数学吧  《8u......
  • 导数学习笔记
    本来这周一就该写的,但是班里有水痘隔离去不了机房,于是作罢,现在补上。12.5今天发了好像是选修二的教材的一部分,赫然写着“导数”二字,大受震撼。下发的时候老师说了句“......
  • 数学建模——什么是数学建模
    主要介绍两个数据建模的实例:包饺子、路障介绍数据建模的全过程介绍数学建模的基本方法和步骤一、引言数学:各门学科的基础,社会进步的工具用数学方法解决任何一个实际问题,都必......
  • JS——Math(数学&随机方法)
    Math对象方法与其他全局对象不同,Math对象没有构造函数。方法和属性是静态的可以在不首先创建Math对象的情况下使用所有方法和属性(常量)方法描述abs(x)返回x......
  • 2023-李林四套卷-数学一
    2023-李林4-1T5行变换,行向量组等价;列变换,列向量组等价T11\(\displaystyle\int\sqrt{a^2-x^2}\,{\rmd}x=\dfrac{a^2}{2}\arcsin\dfrac{x}{a}+\dfrac{x}{2}\sqrt{a^2-x^......