题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692

解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进行维护。这道题就是这样做的,由于某一个点的权值改变,它的子树必定都会受影响,所以这里正好可以用线段树区间更新来维护从0号节点到各个节点的前缀和,那么最大的肯定就是这些区间里最大前缀和。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
ll const INF = 1e18;
int const MAX = 100005;
int n, m;
ll a[MAX], sum[MAX << 2], lazy[MAX << 2], dis[MAX];
int l[MAX], r[MAX], nd[MAX], num;
int head[MAX], cnt;struct EDGE
{int to, nxt, val;
}e[MAX << 1];void Init()
{num = 0;cnt = 0;memset(head, -1, sizeof(head));
}void Add(int u, int v)
{e[cnt].to = v;e[cnt].nxt = head[u];head[u] = cnt ++;
}void DFS(int u, int fa)
{num ++;l[u] = num;nd[num] = u;for(int i = head[u]; i != -1; i = e[i].nxt){int v = e[i].to;if(v != fa){dis[v] = dis[u] + a[v];DFS(v, u);}}r[u] = num;
}void PushUp(int rt)
{sum[rt] = max(sum[rt << 1], sum[rt << 1 | 1]);return;
}void PushDown(int rt)
{if(lazy[rt]){sum[rt << 1] += lazy[rt];sum[rt << 1 | 1] += lazy[rt];lazy[rt << 1] += lazy[rt];lazy[rt << 1 | 1] += lazy[rt];lazy[rt] = 0;}return;
}void Build(int l, int r, int rt)
{lazy[rt] = 0;if(l == r){sum[rt] = dis[nd[l]];return;}int mid = (l + r) >> 1;Build(lson);Build(rson);PushUp(rt);
}void Update(int L, int R, int val, int l, int r, int rt)
{if(L <= l && r <= R){lazy[rt] += val;sum[rt] += val;return;}int mid = (l + r) >> 1;PushDown(rt);if(L <= mid)Update(L, R, val, lson);if(mid < R)Update(L, R, val, rson);PushUp(rt);
}ll Query(int L, int R, int l ,int r, int rt)
{if(L <= l && r <= R)return sum[rt];int mid = (l + r) >> 1;PushDown(rt);ll ans = -INF;if(L <= mid)ans = max(ans, Query(L, R, lson));if(mid < R)ans = max(ans, Query(L, R, rson));return ans;
}int main()
{int T;scanf("%d", &T);for(int ca = 1; ca <= T; ca++){printf("Case #%d:\n", ca);Init();int x, y;scanf("%d %d", &n, &m);for(int i = 0; i < n - 1; i++){scanf("%d %d", &x, &y);Add(x, y);Add(y, x);}for(int i = 0; i < n; i++)scanf("%I64d", &a[i]);dis[0] = a[0];DFS(0, -1);Build(1, n, 1);while(m --){int tp, x, y;scanf("%d", &tp);if(tp == 1){scanf("%d", &x);printf("%I64d\n", Query(l[x], r[x], 1, n, 1));}else{scanf("%d %d", &x, &y);Update(l[x], r[x], y - a[x], 1, n, 1);a[x] = y;}}}
}

hdu 5692 Snacks(dfs序+线段树区间更新)相关推荐

  1. HDU - 5692 Snacks(dfs序+线段树)

    题目链接:点击查看 题目大意:中文题目,不多赘述 题目分析:因为要求路线上权值和最大,我们可以用前缀和的思想来储存,故我们需要来维护最大值,可以用线段树来维护最大值,若想用线段树的话,前提必须是线性区 ...

  2. hdu5692 Snacks dfs序+线段树

    题目传送门 题目大意:给出一颗树,根节点是0,有两种操作,一是修改某个节点的value,二是查询,从根节点出发,经过 x 节点的路径的最大值. 思路:用树状数组写发现还是有些麻烦,最后用线段树了. 其 ...

  3. hdu 1698 Just a Hook 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Let us number the consecutive metallic sticks of ...

  4. hdu 1698 Just a Hook(线段树区间更新·经典)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698 数据:case,n,q,q行x,y,z.在长度为n的hook上进行q次区间更新,把它们的价值改变.最 ...

  5. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

  6. hdu 1556 Color the ball 线段树 区间更新

    水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...

  7. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  8. [CodeForces877 E. Danil and a Part-time Job]dfs序+线段树

    [CodeForces877 E.Danil and a Part-time Job]dfs序+线段树 分类:Data Structure SegMent Tree dfn 1. 题目链接 [Code ...

  9. Jittery Roads Gym - 100889J (虚树 + DP + dfs 序, + 线段树)

    每次给一个点集, 求每个点到其他所有点的最大距离: 会修改边权; 修改边权之后, 我们可以用 dfs 序 + 线段树维护 当前点到根节点的距离. 还可以用树状数组 + 差分思想 维护. { dfs 序 ...

最新文章

  1. CUDA学习(七十一)
  2. Web应用里的HTTP参数污染(HPP漏洞)
  3. vue+webpack热替换
  4. Objc基础学习记录5
  5. php 加载redise_php环境篇:redis服务编译安装
  6. python tkinter计算器实例_Python+tkinter使用80行代码实现一个计算器实例
  7. CSS3渐变——线性渐变
  8. 如何从派生类函数调用父类函数?
  9. HDU 2076 夹角有多大
  10. js统计字符串中特定字符出现的个数
  11. 映射器配置文件和映射器接口
  12. Faster RCNN 网络分析及维度分析
  13. 基于单片机的空气质量(PM2.5)监测系统设计(#0423)
  14. 虚拟机+linux(NeoKylin)网络配置问题:UDP广播不能发送接收数据问题系列解决
  15. @Enumerated
  16. WORD邮件合并打印EXCEL数据制作大量奖证、奖状、准考证、成绩单、明信片、信封等个人报表
  17. 尺子英语怎么读计算机英语怎么读,尺子的英文是什么用英语怎么说
  18. Android项目猜纸牌游戏之一 界面设计和资源文件的设计
  19. Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】
  20. 软件工程的顶会和顶刊

热门文章

  1. 视频 + PPT | 企业服务如何破局增长?
  2. maven——pom.xml
  3. 使用OSOT来优化虚拟桌面2
  4. 【转】程序员该做的事 - 每天、每周、每月
  5. 日志服务接入方式之Unity 3D篇
  6. VC++ 6.0 C8051F340 MFC programming note
  7. io.js 3.0发布:重写Buffer,支持PPC
  8. Easy Slider: 功能强大简单易用的jQuery滑动门插件
  9. c#快捷键(成为高手必备)
  10. 学术部活动具体落实计划