计蒜客 青出于蓝胜于蓝(dfs序+树状数组)
题目描述
武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名
第 n。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。
我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 pp。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。
请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒弟....)中,有多少人的武功超过了他自己。
输入格式
输入第一行两个整数 n, p(1 ≤ n ≤ 100000, 1 ≤ p ≤ n) n , p (1≤n≤100000,1≤p≤n)。
接下来 n-1 行,每行输入两个整数 u, v(1 ≤ u, v ≤ n)u , v (1≤u,v≤n),表示 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
分析
①将每条边输入进去,然后dfs求出这棵树的dfs序,在求dfs序的过程中,数组 num2 记录每个节点的孩子节点数量。
正如样例输入,dfs序为 5,3,4,1,2,8,7,6,9,10
②遍历我们找到的dfs序,数组 d 记录每个编号在dfs序中的位置,为了统一处理,我的dfs序列是从1开始计数的,而不是0。
这一步是为了将这个树形结构序列化,方便我们进行求和操作
③遍历数组d,num数组记录武功排行为 i 的人的子弟有多少人超过了他。
a. num [ i ] = getsum( d [ i ] + num2[ i ] ) – getsum ( d [ i ] )
由于我们我们是从小到大枚举 i ,因此 getsum( d [ i ] + num[ i ] ) – getsum ( d [ i ] ) 就是满足条件的子弟数量。
b. change( d[ i ], 1)
观察第三步中的a步骤,我们发现,num2[i]在求出num[i]后再也没用过,因此num2 与 num 可以共用一个储存空间。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
#include <string.h>
#define MAX 100000
using namespace std;
vector<int> edge[MAX];
int n, root;
int cnt = 1;//记录个数,用于构建dfs序
bool vis[MAX];//记录每条边是否访问过,用于构建dfs序
int dfs_seq[MAX];//记录dfs序
int c[MAX];//树状数组
int num[MAX];//记录每个编号有多少个满足要求的徒弟
int d[MAX];//记录每个节点在dfs序中的位置
void add(int a, int b){
edge[b].push_back(a);
edge[a].push_back(b);
} //树状数组操作
int lowbit(int x){
return x & (-x);
} void change(int x, int v){
while(x <= n){
c[x] += v;
x += lowbit(x);
}
} int getsum(int x){
int sum = 0;
while(x > 0){
sum += c[x];
x -= lowbit(x);
}
return sum;
}
//构建dfs序
int dfs(int root){
int sum = 0;
vis[root] = 1;
dfs_seq[cnt++] = root;
//cout << dfs_seq[cnt - 1] << " ";
for(int i = 0; i < edge[root].size(); i++){
if(!vis[edge[root][i]])
sum += dfs(edge[root][i]) + 1;
}
num[root] = sum;
return sum;
} int main() {
scanf("%d %d", &n, &root);
for(int i = 1; i < n; i++){
int a, b;
scanf("%d %d", &a, &b);
//将此边加入
add(a, b);
} dfs(root); //记录每个节点在dfs序中的位置
for(int i = 1; i <= n; i++){
d[dfs_seq[i]] = i;
} for(int i = 1; i <= n; i++){
num[i] = getsum(d[i] + num[i]) - getsum(d[i]);
change(d[i], 1);
} //依次输出
for(int i = 1; i <= n; i++){
cout << num[i] << "";
}
return 0;
}
计蒜客 青出于蓝胜于蓝(dfs序+树状数组)的更多相关文章
- 计蒜客 31451 - Ka Chang - [DFS序+树状数组][2018ICPC沈阳网络预赛J题]
题目链接:https://nanti.jisuanke.com/t/31451 Given a rooted tree ( the root is node $1$ ) of $N$ nodes. I ...
- 计蒜客A1998 Ka Chang (分块+dfs序+树状数组)
题意 给你一个\(1e5\)的有点权的树,有\(1e5\)个操作: 1.给第\(x\)层的点加上\(y\) 2.求以\(x\)为根的子树的点权和 思路 首先处理出层数为x的所有点 操作2一般都是用df ...
- HDU 3887:Counting Offspring(DFS序+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组
C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...
- 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- [BZOJ1103][POI2007]大都市meg dfs序+树状数组
Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...
- 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)
传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...
随机推荐
- vue 生命钩子周期之理解
对于vue的初学者来说,理解vue的生命钩子周期是很有必要的.什么是生命钩子周期呢,顾名思义就是 “实例初始化” 到 “实例被销毁” 的过程. 理解vue的生命钩子周期,我们就可以更好的在项目中运 ...
- C# 将DataGridView中显示的数据导出到Excel(.xls和.xlsx格式)—NPOI
前言 https://blog.csdn.net/IT_xiao_guang_guang/article/details/104217491 本地数据库表中有46785条数据,测试正常 初次运行程 ...
- NAT ALG原理与应用
1 NAT ALG简介 普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323.SIP等).FTP.S ...
- 最全的 eclipse web 项目目录结构以及Tomcat的各个目录的作用
本文会尽可能对 java web 项目的目录结构做出最详细的解释,尽量做到浅显易懂. eclipse web 项目目录结构 java web 项目事例 03-springmvc-drien-xgq ...
- vue项目用npm安装sass包遇到的问题及解决办法
IDEA启动vue程序,浏览器访问时出现如下情况的关于node-sass的错误: 错误1: Module build failed (from ./node_modules/sass-loader/d ...
- 关于为什么使用React新特性Hook的一些实践与浅见
前言 关于Hook的定义官方文档是这么说的: Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 简单来说,就是在 ...
- vue使用过程中遇到的细节问题
1. 在methods 中添加一个方法.如果这个方法使用箭头函数的话,箭头函数中的this不是当前的vue实例,所以通过this.xxx是获取不到实例上面的属性的,这时我们可以用函数的简写来获取到实例 ...
- python自动更新升级失败解决方案
1,使用python -m pip install --upgrade pip升级失败 2,使用python -m pip install -U --force-reinstall pip依然失败 3 ...
- html文件中引入html文件
一般用于网站提取公共部分的导航栏等 第一种方式:<iframe>标签 在body标签第一行加<iframe>标签 <body> <iframe src=&qu ...
- CSS 绝对定位时,水平居中而不影响原文档中其它元素
div.absolutemiddle { position: absolute; left: 50%; transform: translate(-50%); /* 平移50%为自身尺寸的一半,实现水 ...