题目链接【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的更多相关文章

  1. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  2. HDU 5692 Snacks bfs版本dfs序 线段树

    Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...

  3. 【DFS序+线段树区间更新区间求最值】HDU 5692 Snacks

    http://acm.hdu.edu.cn/showproblem.php?pid=5692 [思路] 每更新一个点,子树的所有结点都要更新,所以是区间更新 每查询一个点,子树的所有结点都要查询,所以 ...

  4. hdu 5692 Snacks 线段树+dfs

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. hdu 5692 Snacks(dfs时间戳+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  6. HDU 5692 Snacks(DFS序+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  8. hdu 5692(dfs+线段树) Snacks

    题目http://acm.hdu.edu.cn/showproblem.php?pid=5692 题目说每个点至多经过一次,那么就是只能一条路线走到底的意思,看到这题的格式, 多个询问多个更新, 自然 ...

  9. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

随机推荐

  1. 【Nginx】修改响应头,根据不同请求IP重定向到不同IP

    背景: 使用CAS登录的过程中会涉及到三次重定向,如果在同一个局域网内,是没有任何问题的,但如果涉及到跨网访问,这个问题就比较蛋疼了. 解决思路: 通过Nginx对要访问的系统进行代理,根据请求IP来 ...

  2. HTML DOM 节点介绍(nodeName,nodeValue,nodeType)

    对于初学者来说,HTML DOM 里面的 nodeName.nodeValue 以及 nodeType 三个属性的作用和取值不是很清楚.下面整理的信息包含有关于节点的详细信息,供参考. 节点信息 每个 ...

  3. Web应用程序完全测试指南

    随着Web技术和移动互联网的发展,越来越多的应用被迁移到了云端,这也使得用户可以随时随地使用它们.目前大量的优质应用,逐渐提升了用户的品味,也降低了用户的容忍度,如果你的Web应用无法使用户满意,那么 ...

  4. Flex用HTTPService调用servlet返回中文乱码解决

    servlet中使用URLEncoder.encode对输出内容进行编码 Flex中使用decodeURIComponent进行解码

  5. 【BZOJ】4033: [HAOI2015]树上染色 树上背包

    [题目]#2124. 「HAOI2015」树上染色 [题意]给定n个点的带边权树,要求将k个点染成黑色,使得 [ 黑点的两两距离和+白点的两两距离和 ] 最大.n<=2000. [算法]树上背包 ...

  6. git push multiple repo

    git remote add xxx https://git.github.com

  7. sqlite3使用简介

    sqlite3使用简介 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文 ...

  8. React 16 源码瞎几把解读 【二】 react组件的解析过程

    一.一个真正的react组件编译后长啥样? 我们瞎几把解读了react 虚拟dom对象是怎么生成的,生成了一个什么样的解构.一个react组件不光由若干个这些嵌套的虚拟dom对象组成,还包括各种生命周 ...

  9. 在ubuntu 上安装pycharm

    1.首先在官网下载pycharm并进行提取,将提取的文件夹放在/usr下面(或者任意位置) 2.然后vi /etc/hosts 编辑 将0.0.0.0 account.jetbrains.com添加到 ...

  10. ios测试apk

    最近apk在ios上面测试总是会遇到奇奇怪怪的问题,现在是两个项目要集成在一个apk中所以将两个项目运行之后都是编译成了.a文件,然后在两个.a文件中都设置了两个意义相同变量名相同的全局变量(标识当前 ...