武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名

第 n。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。

我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 pp。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。

请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒弟....)中,有多少人的武功超过了他自己。

输入格式

输入第一行两个整数 n, p(1 ≤ n ≤ 100000, 1 ≤  p ≤ n) n , p (1≤n≤100000,1≤pn)。

接下来 n-1 行,每行输入两个整数 u, v(1 ≤ u, v ≤ n)u , v  (1≤u,vn),表示 u 和 v 之间存在师徒关系。

输出格式

输出一行 n 个整数,第 i 个整数表示武功排行为 i 的人的子弟有多少人超过了他。

行末不要输出多余的空格。

样例输入

10 5

5 3

5 8

3 4

3 1

2 1

6 7

8 7

9 8

8 10

样例输出

0 0 2 0 4 0 1 2 0 0

题意:对以p为根的树,找有多少个儿子节点比他小。

思路:总体思路是利用dfs序+树状数组(或者线段树也是行得通的)这里只讨论树状数组的做法,线段树的思路类似,都是用

来维护一个单点操作+区间求和的问题。   时间复杂度为 O(nlogn) 


首先,直接在树上操作看起来不大方便,所以可以先已p为根节点求一个dfs序,那样我们就得到一个序列。

比如,根据上图我们可以得到一个dfs序:5,3,4,1,2,8,7,6,9,10

很明显,对于每一个节点,它的儿子节点在其dfs序中肯定是位于本节点之后,且是连续的。

比如节点3,节点3有3个儿子节点,根据dfs序,子节点就是4,1,2。

所以我们可以先求出dfs序,记录每一个节点的子节点个数,那这道题就可以转变为:

给你一个序列,求以每一个节点开始的n个数(当前节点的子节点数),有多少个数小于它。

对于上面这个问题,很明显可以想到求逆序数那一题,只要利用树状数组求解一下就好了,具体方法就是:将序列从小到大以权

值1加入到树状数组中,插入后只需要查询当前要求区间( [i,i+k-1] ,k为节点i的子节点数) 的和,(因为是从小到大加入的,

所以所得求和就是区间中必当前值小的数的个数)。

还不大清楚的可以先看一下求逆序数的思路,再来看这道题。

代码如下:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int dfn[100050],sum[100050],vis[100050],cnt = 0;
int n,b[100050],c[100050],res[100050];
vector<int> E[100050];
void addedge(int u,int v)
{E[u].push_back(v);E[v].push_back(u);
}
int dfs(int root) //求dfs序
{dfn[++cnt] = root;int nums = E[root].size();int tot = 0;for(int i=0;i<nums;i++){int v = E[root][i];if(!vis[v]){vis[v] = 1;tot += dfs(v);}}return sum[root] = tot + 1;
}
int lowbit(int x)
{return x&(-x);
}
void add(int pos,int x)
{while(pos<=n){c[pos]+=x;pos += lowbit(pos);}
}
int query(int pos) //树状数组求和(1-pos) 注意树状数组必须从1开始
{int tot = 0;while(pos>0){tot += c[pos];pos -= lowbit(pos);}return tot;
}
void work(int root)
{vis[root] = 1;sum[root] = dfs(root);for(int i=1;i<=n;i++) b[dfn[i]] = i;for(int i=1;i<=n;i++){res[i] = query(b[i]+sum[i]-1) - query(b[i]);  add(b[i],1);}for(int i=1;i<=n;i++){printf("%d",res[i]);if(i!=n) printf(" ");}printf("\n");
}
int main()
{
#ifdef localfreopen("in.txt","r",stdin);
#endif // localint p; scanf("%d%d",&n,&p);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v);}work(p);
}


计蒜客(青出于蓝胜于蓝) dfs序+树状数组相关推荐

  1. 计蒜客-青出于蓝胜于蓝 dfs+树状数组

    题目描述: 武当派一共有 n人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都 ...

  2. 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和

    前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...

  3. HDU - 5788 Level Up(主席树+dfs序+树状数组)

    题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...

  4. 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组

    武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn.现在我们用武功的排名来给每个人标号,除了祖师爷 ...

  5. 青出于蓝 dfs序+树状数组

    题目来源:蓝桥杯2018模拟 武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名第 n.现在我们用武功的排名来给每个人标号, ...

  6. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  7. 【bzoj2434】[Noi2011]阿狸的打字机 AC自动机+Dfs序+树状数组

    题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...

  8. CF-547E(Mike and Friends)后缀数组+线段树 AC自动机+DFS序+树状数组

    题目链接 题意 NNN个串,每次询问区间[L,R][L,R][L,R]中有多少子串SiS_iSi​ 思路 把NNN个串合成一个长字符串,对这个长字符串求后缀数组,包含SiS_iSi​的子串的heigh ...

  9. HDU - 5877 Weak Pair (dfs序+树状数组+离散化)

    VJ地址 题意:给一个有根树给你,计算一下满足下列条件的序列对的数目 (1)u是v的祖先(不能是它自己) (2)a[v]*a[u]<=k 思路:用DFS序分裂每一条链,使链上的点都是当前加入点的 ...

最新文章

  1. 计算机编程书籍-Python金融大数据分析
  2. PowerDesigner导入MySQL数据库表
  3. 秋招 百度二轮面试---血淋淋的经历写实
  4. 大牛深入浅出讲解C语言#define宏定义应用及使用方法
  5. 给ztree节点赋值
  6. mysql中主从复制包括什么意思_Mysql主从复制作用和工作原理
  7. php 执行shell命令的函数
  8. XX 公司网络信息系统的安全方案设计书
  9. oracle asm 日志,oracle 11g RAC 下ASM实例的alert日志告诉我们什么
  10. 阿里云天池实验室【Python入门系列】用Pandas揭秘美国选民的总统喜好
  11. 阿里、百度、腾讯招聘 Java 程序员的技术标准,你达到要求了吗?
  12. 发布源码及依赖到网络maven仓库
  13. 磁盘阵列服务器上创建虚拟机,UNRAID下虚拟机搭建单机游戏教程
  14. 开展922绿色出行活动 加强城市绿色交通安全管理
  15. 计算机基础知识(基础入门小白专属)二
  16. 以图搜图 相似图片搜索的原理(一)
  17. 电感、电容极性的判断
  18. 微信小程序如何开发购物车的微信支付功能
  19. 蓝牙Mesh学习总结四(Mesh数据包分析)
  20. 关于DirectX中的三角形拾取的的另一种方法

热门文章

  1. Microsoft Exchange Server 2003 反垃圾邮件部署
  2. 计算机机房安全风险防控规范,中心机房安全风险分析一览表.doc
  3. WPF XAML介绍
  4. 企业数字化转型蓝图规划、生态体系建设、数字化管理平台建设方案
  5. Python heap
  6. What is time meaning......
  7. Android利用有道API播放英文发音
  8. 终端远程管理常用命令
  9. 3D场景中的逆运动学介绍
  10. 【UE4学习】5.相机和蓝图进阶