hdu 3887 Counting Offspring dfs 树 树状数组
来源:互联网 发布:node即学即用 编辑:程序博客网 时间:2024/05/20 14:16
题目
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3887
题目来源:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105944#problem/I
简要题意:给定一棵树和根节点编号,求每个点有多少前驱编号小于自己。
题解
看过一些其他人的题解,好像都要dfs贴标签什么的。
实际上只需要在进入和走的时候都统计下相减就能得到子树内的结果了。
搞个数据结构来保存节点的情况,可以选择树状数组。
这个东西我是在某次cf的D学来的。
简单易懂又经典的好模型。
代码
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <stack>#include <queue>#include <string>#include <vector>#include <set>#include <map>#define pb push_back#define mp make_pair#define all(x) (x).begin(),(x).end()#define sz(x) ((int)(x).size())#define fi first#define se secondusing namespace std;typedef long long LL;typedef vector<int> VI;typedef pair<int,int> PII;// headconst int N = 1e5+5;const int M = N<<1;struct Edge { int to, nxt; Edge(int to, int nxt) : to(to), nxt(nxt) {} Edge() {}};int head[N];Edge e[M];void addEdge(int from, int to, int cnt) { e[cnt] = Edge(to, head[from]); head[from] = cnt;}void init(int n) { for (int i = 0; i <= n; i++) head[i] = -1;}struct BIT { int tree[N] ; inline int lowbit(int x) { return x&(-x); } void add(int x, int add, int n) { for (; x <= n; x += lowbit(x)) { tree[x] += add; } } int sum(int x) { int s = 0; for (; x > 0; x -= lowbit(x)) { s += tree[x]; } return s; } int query(int l, int r) { return sum(r)-sum(l-1); } void clear() { memset(tree, 0, sizeof tree); }};BIT bit;int res[N];int n, q;void dfs(int x, int fa) { res[x] -= bit.sum(x-1); for (int i = head[x]; ~i; i = e[i].nxt) { int to = e[i].to; if (to == fa) continue; dfs(to, x); } bit.add(x, 1, n); res[x] += bit.sum(x-1);}int main() { while (scanf("%d%d", &n, &q) == 2 && n) { bit.clear(); init(n); memset(res, 0, sizeof res); int u, v, ec = 0; for (int i = 1; i < n; i++) { scanf("%d%d", &u, &v); addEdge(u, v, ec++); addEdge(v, u, ec++); } dfs(q, -1); for (int i = 1; i <= n; i++) { printf("%d%c", res[i], i==n ? '\n' : ' '); } } return 0;}
0 0
- hdu 3887 Counting Offspring dfs 树 树状数组
- HDU 3887 Counting Offspring 树状数组 + 栈模拟dfs
- HDU ACM 3887 Counting Offspring 树状数组+DFS
- HDU 3887 Counting Offspring(dfs序 + 树状数组)
- HDU-3887-Counting Offspring-dfs序+树状数组
- HDU 3887 Counting Offspring(dfs序+树状数组)
- HDU 3887 Counting Offspring (树状数组+dfs)
- hdu 3887 Counting Offspring(dfs序+树状数组)
- HDU 3887 Counting Offspring 树状数组
- HDU 3887 Counting Offspring (树状数组)
- hdu3887 Counting Offspring(dfs序+树状数组)
- hdu3887-dfs序&树状数组-Counting Offspring
- HDU 3887 Counting Offspring (DFS + BIT或划分树)
- hdu3887 Counting Offspring(dfs序+树状数组)
- hdu 3887 Counting Offspring
- HDU 3887 Counting Offspring
- hdu 3887 Counting Offspring
- HDU 3887 Counting Offspring dfs序的运用 | 非递归
- 我的校招准备第一弹
- Android性能优化典范(一)
- GCD之阻塞死锁问题以及多个图片下载优化
- Android动画框架(三)----布局动画&Activity过渡动画
- NYOJ 取石子 (四)
- hdu 3887 Counting Offspring dfs 树 树状数组
- 集训队专题(7)1005 kebab
- Unity3D 5 官方教程:地形设置
- 【C/C++语法】Chapter 1
- XML解析与创建之——DOM
- 项目七-简单的四则运算
- Android时钟控件
- OpenCV解析SVM
- Tomcat+Spring web不能引入jquery