zzuliOJ1916:树(DFS序 + 树状数组)
来源:互联网 发布:工商网络监管情况 编辑:程序博客网 时间:2024/06/05 06:11
1916: 树
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 226 Solved: 19
SubmitStatusWeb Board
Description
给一颗树,有n个结点,编号为1到n,1为根节点,有两种操作,1 x y把x结点权值加y,2 x查询x到根节点所有结点的权值和.
每个结点权值初始化为0。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行为两个整数n,m代表结点个数和操作次数。
接下来n-1行,每行两个整数a,b,表示a结点和b结点有一条边。
接下来m行每行一个操作格式如上。
0<=n<=50000 ,0<=m<=50000,0<=y<=50000
Output
对于每组查询输出一个整数表示结果
Sample Input
1
5 5
1 2
1 3
3 4
3 5
2 5
1 1 2
1 3 1
2 4
2 1
Sample Output
0
3
2
HINT
Source
haut
思路:因为涉及到多次修改权值,考虑差分的思想,先标记一下,查询的时候再计算前缀和,那么需要用dfs序将树重新编号,in和out分别表示进入节点i和离开节点i的时间戳,那么in[i]和out[i]之间的都是i的子树节点,in标记为正,out标记位负,查询时计算下前缀和即可,这里计算前缀和用树状数组加速。
# include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 5e4+3;int in[maxn], out[maxn], Next[maxn], cnt, cnt2;int t, n, m, a, b, c;LL sum[maxn<<1];struct node{ int e, next, w;}edge[maxn<<1];void add(int u, int v, int e){ edge[cnt].e = v; edge[cnt].next = Next[u]; Next[u] = cnt++;}void dfs(int u, int pre){ in[u] = ++cnt2; for(int i=Next[u]; i!=-1; i=edge[i].next) { int v = edge[i].e; if(v == pre) continue; dfs(v, u); } out[u] = ++cnt2;}int lowbit(int x){ return x&(-x);}void update(int x, int num){ for(int i=x; i<=(n<<1); i+=lowbit(i)) sum[i] += num;}LL query(int x){ LL ans = 0; for(int i=x; i>=1; i-=lowbit(i)) ans += sum[i]; return ans;}int main(){ scanf("%d",&t); while(t--) { cnt = cnt2 = 0; memset(Next, -1, sizeof(Next)); memset(sum , 0, sizeof(sum)); scanf("%d%d",&n,&m); for(int i=0; i<n-1; ++i) { scanf("%d%d",&a,&b); add(a, b, 0); add(b, a, 0); } dfs(1, -1); while(m--) { scanf("%d",&c); if(c == 1) { scanf("%d%d",&a,&b); update(in[a], b); update(out[a], -b); } else { scanf("%d",&a); printf("%lld\n",query(in[a])); } } } return 0;}
阅读全文
0 0
- zzuliOJ1916:树(DFS序 + 树状数组)
- dfs序+树状数组
- 【zzuliOJ】1916 - 树(dfs序 & 树状数组)
- codevs1228 苹果树(dfs序&&(线段树||树状数组))
- codevs 1228(DFS序+线段树/树状数组)
- BZOJ2819 Nim(dfs序+树状数组)
- 【Codevs1228】苹果树(dfs序+树状数组)
- zzulioj 1916 (DFS序 树状数组)
- FZU2277 Change(dfs序+树状数组)
- poj 3321(dfs序&&树状数组)
- bzoj 1103(DFS序+树状数组)
- hdu5877 dfs序+树状数组
- POJ3321 dfs序+树状数组
- POJ3321(dfs序+树状数组)
- bzoj2434 ac自动机+fail树+Dfs序+树状数组
- bzoj2780 广义后缀自动机+parent树+Dfs序+树状数组
- codeves 苹果树 dfs序+树状数组/线段树
- POJ Apple Tree (树状数组 + dfs序)
- 高精度加法的c语言实现
- Android存储对象到本地(SharedPreferences方式和file方式)
- Hello World!
- 冒泡排序--双层嵌套,两两比较
- socket请求数据demo
- zzuliOJ1916:树(DFS序 + 树状数组)
- [Git]不给Github交保护费:CentOS下的私人Git的搭建方法
- pod命令图示
- 面向思想的落地法则一
- 复习三-bfs
- Arduino 使用Metor库 简单实现多线程编程
- 3.vector实现字符串类
- 【reset.css重置文件夹】
- LeetCode Minimum Factorization