DFS序--树的问题转化为区间问题
问题概述:一颗树有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序--树的问题转化为区间问题相关推荐
- 树链剖分 or 根号分治 + dfs序 + 树状数组 ---- CF1254 D. Tree Queries
题目链接 题目大意: 问题转化: 很容易发现:假设修改的节点是vvv. 1.vvv的子树sonvson_vsonv直接加上(n−size[sonv])n×d\frac{(n-size[son_v]) ...
- 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组
武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn.现在我们用武功的排名来给每个人标号,除了祖师爷 ...
- DFS序——树链剖分前驱知识
目录 定义:dfs序:每个节点在dfs深度优先遍历中的进出栈的时间序列. 性质:dfs序可以把一棵树区间化,即可以求出每个节点的管辖区间. 对于一棵树的dfs序而言,同一棵子树所对应的一定是dfs序中 ...
- 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和
前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...
- 计蒜客(青出于蓝胜于蓝) dfs序+树状数组
武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名 第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师 ...
- [Split The Tree][dfs序+树状数组求区间数的种数]
Split The Tree 时间限制: 1 Sec 内存限制: 128 MB 提交: 46 解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- Apple Tree(dfs序+树状数组)
题目(传送门poj3321) Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 40714 Accepted: ...
- HDU - 5788 Level Up(主席树+dfs序+树状数组)
题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...
最新文章
- python入门指南 许半仙txt百度云-《剑有话说》TXT全本 百度云网盘下载 by一刀绣春...
- PVLAN技术应用,网络管理员的新宠
- Node.js 笔记 http服务器
- mysql log 记录报错 sql语句_MySQL生产库中添加修改表字段引起主从崩溃的问题总结...
- 用 S5PV210 学习 Linux (一) 刷机(一)
- 培训机构破产了,“我还要还贷到2028年”
- 刚刚,任正非为姚安娜商标事件道歉
- php环形链表,PHP环形链表实现方法示例
- VB手控Combobox的打开或收起
- CAAnimation KeyPath学习总结
- 利用filebeat推送mysql慢查询日志
- Java开发中常用的设计模式-单例模式
- C++之boost库报错:note: in expansion of macro BOOST_MPL_ASSERT_NOT
- 哥尼斯堡的“七桥问题” (25 分)(DFS)
- Jsoup爬虫以及防反爬
- 李嘉诚80个人生经典语录
- 百度bae专业版svn提交问题
- 吐鲁番市谷歌高清卫星地图下载
- 加盐密码哈希:如何正确使用 (密码加密的经典文章)
- 【git 常用配置及常用命令】