J. 青出于蓝胜于蓝(dfs序+树状数组)
武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。
我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 ppp。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。
请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒弟....)中,有多少人的武功超过了他自己。
输入格式
输入第一行两个整数 n,p(1≤n≤100000,1≤p≤n)n, p(1 \le n \le 100000, 1 \le p \le n)n,p(1≤n≤100000,1≤p≤n)。
接下来 n−1n-1n−1 行,每行输入两个整数 u,v(1≤u,v≤n)u, v(1 \le u, v \le n)u,v(1≤u,v≤n),表示 uuu 和 vvv 之间存在师徒关系。
输出格式
输出一行 nnn 个整数,第 iii 个整数表示武功排行为 iii 的人的子弟有多少人超过了他。
行末不要输出多余的空格。
样例输入
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
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&(-x))
typedef long long ll;
using namespace std;
/*
树状数组就是来求前缀和,有忘了,wuwuwu...
我知道要求dfs序,但是不知道怎么来求一段区间内的小于等于某个值的数量
我们都是从最小值网上走的,我们是按照val,来的,所以直接查询,在【l,r】
内的数量就可以了,优美
*/
const int maxn=1e5+10;
int cnt;
int head[maxn*2];
struct Edge{int v,nt;
}edge[maxn*2];
void add_edge(int u,int v){edge[cnt].nt=head[u];edge[cnt].v=v;head[u]=cnt++;
}
int l[maxn],r[maxn];void dfs(int now,int fa,int& id){l[now]=++id;//for(int i=head[now];i!=-1;i=edge[i].nt){int v=edge[i].v;if(v==fa) continue;dfs(v,now,id);}r[now]=id;
}void print(int n){for(int i=1;i<=n;i++){printf("i:%d %d %d\n",i,l[i],r[i]);}
}
int n;
int tr[maxn];
int get_sum(int x){int sum=0;while(x>0){sum+=tr[x];x-=lowbit(x);}return sum;
}void update(int x,int val){while(x<=n){tr[x]+=val;x+=lowbit(x);}
}
int ans[maxn];int main(){cnt=0;memset(head,-1,sizeof(head));int rt;scanf("%d %d",&n,&rt);for(int i=1;i<n;i++){int u,v;scanf("%d %d",&u,&v); add_edge(u,v);add_edge(v,u);}int id=0;dfs(rt,-1,id);
// print(n);for(int i=1;i<=n;i++){ans[i]=get_sum(r[i])-get_sum(l[i]);update(l[i],1);}for(int i=1;i<=n;i++){if(i==1) printf("%d",ans[i]);else printf(" %d",ans[i]);}printf("\n");return 0;
}
J. 青出于蓝胜于蓝(dfs序+树状数组)相关推荐
- 计蒜客(青出于蓝胜于蓝) dfs序+树状数组
武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名 第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师 ...
- 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和
前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...
- HDU - 5788 Level Up(主席树+dfs序+树状数组)
题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...
- 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组
武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn.现在我们用武功的排名来给每个人标号,除了祖师爷 ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- 【bzoj2434】[Noi2011]阿狸的打字机 AC自动机+Dfs序+树状数组
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...
- CF-547E(Mike and Friends)后缀数组+线段树 AC自动机+DFS序+树状数组
题目链接 题意 NNN个串,每次询问区间[L,R][L,R][L,R]中有多少子串SiS_iSi 思路 把NNN个串合成一个长字符串,对这个长字符串求后缀数组,包含SiS_iSi的子串的heigh ...
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, -, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...
- HDU 6203 ping ping ping (在线倍增lca+DFS序+树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 #include<bits/stdc++.h> using namespace st ...
- [Split The Tree][dfs序+树状数组求区间数的种数]
Split The Tree 时间限制: 1 Sec 内存限制: 128 MB 提交: 46 解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...
最新文章
- 视频直播点播nginx-rtmp开发手册中文版
- 使用Roslyn将代码编译成单独的网络模块并将它们组装成动态库
- 超清晰的 DNS 原理入门指南 (资源)
- wpf之lable右下角放关闭图标
- 高并发之——并发测试工具ab
- 文件夹内批量修改文件名称
- python爬取裁判文书_使用selenium爬取裁判文书网
- C盘扩容:如何把D盘内存扩展到c盘?
- Winedit 下载第三方库
- c语言srand函数用法,srand
- 怎么画出好的架构图,架构师必备。。
- hashTabel List 和 dic
- 采购中心如何高效管理供应商的质量?
- 前端必会三种CSS布局
- [长安战疫-cazy] Web题解
- 大学四年如何有效的使用『牛客』平台
- codeforces Hello 2021
- BP神经网络简单应用实例,bp神经网络的设计方法
- 打开和关闭HDMI输出方法
- 区块链公有链、私有链和联盟链是什么?它们有什么特点?