HDU 5692 Snacks
题目链接【http://acm.hdu.edu.cn/showproblem.php?pid=5692】
题意:一棵树,每个节点有权值,有两种操作:1、修改某个点的权值,2、求以x根的子树中的节点到根的权值和的最大值。
题解:DFS序:对点进行重新编号,每个子树中的所有的节点的编号是连续的。映射到线段树上,进行区间修改,区间查询。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- typedef long long LL;
- const int maxn = 1e6 + ;
- int T, N, Q;
- LL a[maxn], sum[maxn];
- struct Edge
- {
- int to, next;
- Edge (int to = , int next = ): to(to), next(next) {}
- } E[maxn * ];
- int head[maxn], tot;
- void initEdge()
- {
- for(int i = ; i <= N + ; i++) head[i] = -;
- tot = ;
- }
- void addEdge(int u, int v)
- {
- E[tot] = Edge(v, head[u]);
- head[u] = tot++;
- }
- int L[maxn], R[maxn], dfs_clock;
- void DFS(int u, int fa)
- {
- L[u] = ++dfs_clock;
- sum[L[u]] = a[u] + sum[L[fa]];
- for(int k = head[u]; ~k; k = E[k].next)
- {
- int v = E[k].to;
- if(v == fa) continue;
- DFS(v, u);
- }
- R[u] = dfs_clock;
- }
- LL ma[maxn * ], fg[maxn * ];
- void Build(int id, int L, int R)
- {
- fg[id] = ;
- if(L == R)
- {
- ma[id] = sum[L];
- return ;
- }
- int mid = (L + R) >> ;
- Build(id << , L, mid);
- Build(id << | , mid + , R);
- ma[id] = max(ma[id << ], ma[id << | ]);
- }
- inline void push_down(int id)
- {
- if(fg[id])
- {
- fg[id << ] += fg[id];
- ma[id << ] += fg[id];
- fg[id << | ] += fg[id];
- ma[id << | ] += fg[id];
- fg[id] = ;
- }
- }
- void update(int id, int L, int R, int l, int r, LL val)
- {
- if(L == l && R == r)
- {
- fg[id] += val;
- ma[id] += val;
- return ;
- }
- push_down(id);
- int mid = (L + R) >> ;
- if(r <= mid)
- update(id << , L, mid, l, r, val);
- else if(l >= mid + )
- update(id << | , mid + , R, l, r, val);
- else
- {
- update(id << , L, mid, l, mid, val);
- update(id << | , mid + , R, mid + , r, val);
- }
- ma[id] = max(ma[id << ], ma[id << | ]);
- }
- LL query(int id, int L, int R, int l, int r)
- {
- if(L == l && R == r)
- return ma[id];
- push_down(id);
- int mid = (L + R) >> ;
- if(r <= mid)
- return query(id << , L, mid, l, r);
- else if(l >= mid + )
- return query(id << | , mid + , R, l, r);
- else
- {
- LL t = query(id << , L, mid, l, mid);
- return max(t, query(id << | , mid + , R, mid + , r));
- }
- }
- int main ()
- {
- int ic = ;
- scanf("%d", &T);
- while(T--)
- {
- scanf("%d %d", &N, &Q);
- initEdge();
- for(int i = ; i <= N - ; i++)
- {
- int u, v;
- scanf("%d %d", &u, &v);
- addEdge(u + , v + );
- addEdge(v + , u + );
- }
- for(int i = ; i <= N; i++) scanf("%lld", &a[i]);
- dfs_clock = , DFS(, );
- Build(, , N);
- printf("Case #%d:\n", ++ic);
- for(int i = ; i <= Q; i++)
- {
- int ty, x;
- LL y;
- scanf("%d", &ty);
- if(ty == )
- {
- scanf("%d %lld", &x, &y);
- x++;
- update(, , N, L[x], R[x], y - a[x]);
- a[x] = y;
- }
- else if(ty == )
- {
- scanf("%d", &x);
- x++;
- LL ans = query(, , N, L[x], R[x]);
- printf("%lld\n", ans);
- }
- }
- }
- return ;
- }
HDU 5692 Snacks的更多相关文章
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU 5692 Snacks bfs版本dfs序 线段树
Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...
- 【DFS序+线段树区间更新区间求最值】HDU 5692 Snacks
http://acm.hdu.edu.cn/showproblem.php?pid=5692 [思路] 每更新一个点,子树的所有结点都要更新,所以是区间更新 每查询一个点,子树的所有结点都要查询,所以 ...
- hdu 5692 Snacks 线段树+dfs
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 5692 Snacks(dfs时间戳+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 5692 Snacks(DFS序+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- hdu 5692(dfs+线段树) Snacks
题目http://acm.hdu.edu.cn/showproblem.php?pid=5692 题目说每个点至多经过一次,那么就是只能一条路线走到底的意思,看到这题的格式, 多个询问多个更新, 自然 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
随机推荐
- 【Nginx】修改响应头,根据不同请求IP重定向到不同IP
背景: 使用CAS登录的过程中会涉及到三次重定向,如果在同一个局域网内,是没有任何问题的,但如果涉及到跨网访问,这个问题就比较蛋疼了. 解决思路: 通过Nginx对要访问的系统进行代理,根据请求IP来 ...
- 查询PHP版本
查询php版本: phpinfo();
- tp5 r3 一个简单的SQL语句调试实例
tp5 r3 一个简单的SQL语句调试实例先看效果核心代码 public function index() { if (IS_AJAX && session("uid&quo ...
- Python 正则表达式、re模块
一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是 ...
- 批量删除.svn文件夹和.svn文件
新建可运行文件 Windows环境 将下面的代码保存为 kill-svn.bat文件,放到要删除.svn文件的目录下,双击运行即可 @echo on @rem 删除SVN版本控制目录 @rem for ...
- git版本控制系统常见操作总结
简介 Git是强大的版本控制系统,主要功能是针对代码.配置文件等文本进行版本控制.备份等,同时个人认为还是分发代码的一个不错的方式. 常见用法 #创建远程git仓库 [root@test88 ~]# ...
- Idea安装Scala插件(转)
原文链接:http://blog.csdn.net/a2011480169/article/details/52712421 参考博客: 1.http://wwwlouxuemingcom.blog. ...
- [HTML]增加input标签的multiple属性上传的文件数
.发现问题 <input type="file" name="myfile[]" multiple="multiple"/> 最 ...
- linux 下配置文件目录/etc/sysconfig
/etc/sysconfig/目录详解 2010-06-19 11:12 6693人阅读 评论(1) 收藏 举报 桌面环境debugging防火墙serviceunix语言 /etc/sysconfi ...
- leetcode 之trap water(8)
这题不太好想.可以先扫描找到最高的柱子,然后分别处理两边:记录下当前的局部最高点,如果当前点小于局部最高点,加上, 反则,替换当前点为局部最高点. int trapWater(int A[], int ...