BOJ 395 Tree
来源:互联网 发布:mac sass安装失败 编辑:程序博客网 时间:2024/06/06 04:01
395. Tree
题目描述
Given a rooted tree with values assigned on each node, you're required to answer how many nodes on the path from the root to
输入格式
An integer
输出格式
Output the answer for each node from node
输入样例
141 21 34 24 1 5 0
输出样例
010 2
解题思路:
先将每一个节点离散化,再用一个数组C[x],记录value值为x的节点的个数(在这里我使用的是树状数组,貌似用一般的数组好像会超时),然后在dfs的同时,记录该点value值的C数组以及该点前面的大于它的value值的点的个数,回溯的时候再回复C数组。
#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <climits>#include <complex>#include <fstream>#include <cassert>#include <cstdio>#include <bitset>#include <vector>#include <deque>#include <queue>#include <stack>#include <ctime>#include <set>#include <map>#include <cmath>#define lowbit(x) x&(-x)using namespace std;const int MAXN=100010;vector<int> head[MAXN];int n,ans[MAXN];bool vis[MAXN];int c[MAXN];struct Con{int va,num;}a[MAXN];int tot=0,now[MAXN];//now表述压缩过的value,角标相同void update(int i,int v){for(;i<=tot;i+=lowbit(i))c[i]+=v;}int getsum(int i){int sum=0;for(;i>0;i-=lowbit(i))sum+=c[i];return sum;}void add(int a,int b){ head[a].push_back(b); head[b].push_back(a);}void dfs(int x){vis[x]=true;update(now[x],1); ans[x]=getsum(tot)-getsum(now[x]);for(int i=0;i<head[x].size();i++) { int temp=head[x][i]; if(!vis[temp]) dfs(temp); } update(now[x],-1); return ;}bool cmp(Con a,Con b){ return a.va<b.va;}void compress(){ sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { if(a[i].va==a[i-1].va&&i!=1) now[a[i].num]=tot; else now[a[i].num]=++tot; }}void init(){ memset(ans,0,sizeof(ans)); memset(c,0,sizeof(c)); memset(vis,0,sizeof(vis)); memset(now,0,sizeof(now)); for(int i=0;i<=n;i++) head[i].clear();tot=0;}int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);init();for(int i=1;i<n;i++) { int a,b; scanf("%d %d",&a,&b); add(a,b); } for(int i=1;i<=n;i++) { int value; scanf("%d",&value); a[i].num=i;a[i].va=value; } compress(); dfs(1); for(int i=1;i<=n;i++) printf("%d\n",ans[i]);}return 0;}
- BOJ 395 Tree
- 树状数组 boj 399. Who Is Joyful boj 395. Tree
- BOJ 288
- BOJ 394
- BOJ 396
- BOJ 385
- BOJ 519
- BOJ 93
- BOJ 204
- BOJ 672
- BOJ 1454
- BOJ 387
- BOJ 652
- BOJ 1452
- BOJ 1461
- BOJ 1450
- boj contest, C++
- boj 215(树形DP)
- 第五十二题(二元树的深度)
- [Python]Windows下python环境变量配置
- 大整数模板(c++)—算法竞赛入门
- 线程的同步synchronized
- MFC+openCV学习
- BOJ 395 Tree
- WiFi共享精灵文件传输新功能:金币话费领不停
- 内存池
- Shannon entropy
- PAT循环-11. 水仙花数(20)
- 跨进程 获取 syslistview32 内容
- 初步理解Android的MediaScanner(2)
- 华为招聘机试整理6:选秀节目打分
- IO流练习