hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接: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序+线段树区间更新)相关推荐
- HDU - 5692 Snacks(dfs序+线段树)
题目链接:点击查看 题目大意:中文题目,不多赘述 题目分析:因为要求路线上权值和最大,我们可以用前缀和的思想来储存,故我们需要来维护最大值,可以用线段树来维护最大值,若想用线段树的话,前提必须是线性区 ...
- hdu5692 Snacks dfs序+线段树
题目传送门 题目大意:给出一颗树,根节点是0,有两种操作,一是修改某个节点的value,二是查询,从根节点出发,经过 x 节点的路径的最大值. 思路:用树状数组写发现还是有些麻烦,最后用线段树了. 其 ...
- hdu 1698 Just a Hook 线段树区间更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Let us number the consecutive metallic sticks of ...
- hdu 1698 Just a Hook(线段树区间更新·经典)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698 数据:case,n,q,q行x,y,z.在长度为n的hook上进行q次区间更新,把它们的价值改变.最 ...
- 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...
- hdu 1556 Color the ball 线段树 区间更新
水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...
- New Year Tree(dfs序+线段树+二进制)
题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...
- [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 ...
- Jittery Roads Gym - 100889J (虚树 + DP + dfs 序, + 线段树)
每次给一个点集, 求每个点到其他所有点的最大距离: 会修改边权; 修改边权之后, 我们可以用 dfs 序 + 线段树维护 当前点到根节点的距离. 还可以用树状数组 + 差分思想 维护. { dfs 序 ...
最新文章
- CUDA学习(七十一)
- Web应用里的HTTP参数污染(HPP漏洞)
- vue+webpack热替换
- Objc基础学习记录5
- php 加载redise_php环境篇:redis服务编译安装
- python tkinter计算器实例_Python+tkinter使用80行代码实现一个计算器实例
- CSS3渐变——线性渐变
- 如何从派生类函数调用父类函数?
- HDU 2076 夹角有多大
- js统计字符串中特定字符出现的个数
- 映射器配置文件和映射器接口
- Faster RCNN 网络分析及维度分析
- 基于单片机的空气质量(PM2.5)监测系统设计(#0423)
- 虚拟机+linux(NeoKylin)网络配置问题:UDP广播不能发送接收数据问题系列解决
- @Enumerated
- WORD邮件合并打印EXCEL数据制作大量奖证、奖状、准考证、成绩单、明信片、信封等个人报表
- 尺子英语怎么读计算机英语怎么读,尺子的英文是什么用英语怎么说
- Android项目猜纸牌游戏之一 界面设计和资源文件的设计
- Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】
- 软件工程的顶会和顶刊