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 ...
随机推荐
- 使用 WebSockets 技术的 9 个应用场景
没有其他技术能够像WebSocket一样提供真正的双向通信,许多web开发者仍然是依赖于ajax的长轮询来实现.对Websocket缺少热情,也许是因为多年前他的安全性的脆弱,抑或者是缺少浏览器的支持 ...
- session_write_close()的作用
简单地说,当开启session_start以后,这个session会一直开启,并且被一个用户使用.其他用户开启session的话要等待第一个session用户关闭以后才可以开启sessio,这样就造成 ...
- 使用Forms Authentication
using System; using System.Web; using System.Web.Security; namespace AuthTest { public class Aut ...
- 数组中的each 和 jquery 中的 each
数组的实例上都有一个叫做 forEach 的方法,这个方法定义在 Array.prototype 上,所以数组的所有实例都可以使用 forEach 这个方法. forEach 方法的语法结构如下: v ...
- Wireshark过滤语句中常用的操作符
关键字有: eq,== 等于ne,!= 不等于gt,> 比…大lt,< 比…小 ge,>= 大于等于le,<= 小于等于 and,|| 且 or,&& 或 no ...
- python 实现字符串转整型
def str2Int(s): l=list(s) if len(l)<=0: return 0 flag=0 sum=0 dict_num={':9} dict_tag={'+':1,'-': ...
- ThinkPHP的运行流程-2
Thinkphp为了提高编译的效率,第一次运行的时候thinkphp会把文件全部编译到temp目录下的~runtime.php文件,在第二次运行的时候会直接读取这个文件.所以我们在线下自己写代码测试的 ...
- Python3 断言
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:CarsonLi ''' 断言一般用于后面有非常重要的操作,需要使用前面的数据,而且不容许出 ...
- defer用途
package main /* defer :程序退出时执行,先进后执行 defer庸碌: 1.关闭文件句柄 2.锁资源释放 3.数据库连接释放 */ import ( "fmt" ...
- HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...