问题概述:一颗树有n个结点,编号为1到n,其中1为根节点,现有两种操作:1 x y表示将x结点的权值加上y,2 x表

示查询x到根节点中所有结点的权值和,每个结点权值初始都为0,n和m都小于50000

(http://acm.zzuli.edu.cn/zzuliacm/problem.php?cid=1159&pid=2)

输入样例:                                  对应输出:

1                                                  0

5 5                                               3

1 2                                               2

1 3

3 4

3 5

2 5

1 1 2

1 3 1

2 4

2 1

解题步骤:

①对该树从根节点开始搜索,初始化step==0,每当循环到一个点k时,记录s[k].down==++step,当循环完该点及其

所有子节点准备回溯时,记录s[k].up==++step,那么树对应的区间a[s[k].down]存的便是k点权值的负数,a[s[k].up]

存的便是k点的权值

②对于树的单节点修改--即修改区间中a[s[k].down]和a[s[k].up]的值,

对于树的查询--即查询a[s[k].up]到a[2*n]中间所有值之和

③对于②操作用线段树或树状数组即可

例如对于n==5的树:1->2,1->3,3->4,3->5,第n个点的权值为n,

转化为区间就是:-1 -2 2 -3 -4 4 -5 5 3 1

#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
typedef struct
{int up;int down;
}Loct;
Loct s[50005];
int n, step;
long long in[100005];
vector<int> v[50005];
void Sech(int x, int p);
int lowbit(int k)
{return k&-k;
}
void Update(int k, int y)
{while(k<=2*n){in[k] += y;k += lowbit(k);}
}
long long Query(int k)
{long long sum;sum = 0;while(k>=1){sum += in[k];k -= lowbit(k);}return sum;
}
int main(void)
{int T, m, i, a, b, t;scanf("%d", &T);while(T--){scanf("%d%d", &n, &m);step = 0;memset(in, 0, sizeof(in));for(i=1;i<=n;i++)v[i].clear();for(i=1;i<=n-1;i++){scanf("%d%d", &a, &b);v[a].push_back(b), v[b].push_back(a);}Sech(1, 0);for(i=1;i<=m;i++){scanf("%d", &t);if(t==1){scanf("%d%d", &a, &b);Update(s[a].down, -b);Update(s[a].up, b);}if(t==2){scanf("%d", &a);printf("%lld\n", Query(n*2)-Query(s[a].up-1));}}}return 0;
}void Sech(int x, int p)
{int i, temp;s[x].down = ++step;for(i=0;i<v[x].size();i++){temp = v[x][i];if(temp==p)continue;Sech(temp, x);}s[x].up = ++step;
}

DFS序--树的问题转化为区间问题相关推荐

  1. 树链剖分 or 根号分治 + dfs序 + 树状数组 ---- CF1254 D. Tree Queries

    题目链接 题目大意: 问题转化: 很容易发现:假设修改的节点是vvv. 1.vvv的子树sonvson_vsonv​直接加上(n−size[sonv])n×d\frac{(n-size[son_v]) ...

  2. 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组

    武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn.现在我们用武功的排名来给每个人标号,除了祖师爷 ...

  3. DFS序——树链剖分前驱知识

    目录 定义:dfs序:每个节点在dfs深度优先遍历中的进出栈的时间序列. 性质:dfs序可以把一棵树区间化,即可以求出每个节点的管辖区间. 对于一棵树的dfs序而言,同一棵子树所对应的一定是dfs序中 ...

  4. 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和

    前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...

  5. 计蒜客(青出于蓝胜于蓝) dfs序+树状数组

    武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名 第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师 ...

  6. [Split The Tree][dfs序+树状数组求区间数的种数]

    Split The Tree 时间限制: 1 Sec  内存限制: 128 MB 提交: 46  解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...

  7. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  8. Apple Tree(dfs序+树状数组)

    题目(传送门poj3321) Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 40714 Accepted: ...

  9. HDU - 5788 Level Up(主席树+dfs序+树状数组)

    题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...

最新文章

  1. python入门指南 许半仙txt百度云-《剑有话说》TXT全本 百度云网盘下载 by一刀绣春...
  2. PVLAN技术应用,网络管理员的新宠
  3. Node.js 笔记 http服务器
  4. mysql log 记录报错 sql语句_MySQL生产库中添加修改表字段引起主从崩溃的问题总结...
  5. 用 S5PV210 学习 Linux (一) 刷机(一)
  6. 培训机构破产了,“我还要还贷到2028年”
  7. 刚刚,任正非为姚安娜商标事件道歉
  8. php环形链表,PHP环形链表实现方法示例
  9. VB手控Combobox的打开或收起
  10. CAAnimation KeyPath学习总结
  11. 利用filebeat推送mysql慢查询日志
  12. Java开发中常用的设计模式-单例模式
  13. C++之boost库报错:note: in expansion of macro BOOST_MPL_ASSERT_NOT
  14. 哥尼斯堡的“七桥问题” (25 分)(DFS)
  15. Jsoup爬虫以及防反爬
  16. 李嘉诚80个人生经典语录
  17. 百度bae专业版svn提交问题
  18. 吐鲁番市谷歌高清卫星地图下载
  19. 加盐密码哈希:如何正确使用 (密码加密的经典文章)
  20. 【git 常用配置及常用命令】

热门文章

  1. python编程入门 适合于零基础朋友-[零基础学python]复习if语句
  2. 未来语音识别技术的发展趋势会如何
  3. MongoDB更新文档(非常详细,不要错过~)
  4. vue-seamless-scroll
  5. Nacos 介绍 --- 单机、集群部署
  6. SpringBoot+Vue.js实现大文件分片上传、断点续传与极速秒传
  7. java swing html_Swing中如何使用HTML按钮
  8. html中隐式转换成数字,详解JS中的隐式类型转换
  9. mysql禁止远程连接
  10. Markdown支持的语言