Snacks

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2165    Accepted Submission(s): 513

Problem Description
百度科技园内有n个零食机,零食机之间通过n−1条路相互连通。每个零食机都有一个值v,表示为小度熊提供零食的价值。

由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。

为小度熊规划一个路线,使得路线上的价值总和最大。

 
Input
输入数据第一行是一个整数T(T≤10),表示有T组测试数据。

对于每组数据,包含两个整数n,m(1≤n,m≤100000),表示有n个零食机,m次操作。

接下来n−1行,每行两个整数x和y(0≤x,y<n),表示编号为x的零食机与编号为y的零食机相连。

接下来一行由n个数组成,表示从编号为0到编号为n−1的零食机的初始价值v(|v|<100000)。

接下来m行,有两种操作:0 x y,表示编号为x的零食机的价值变为y;1 x,表示询问从编号为0的零食机出发,必须经过编号为x零食机的路线中,价值总和的最大值。

本题可能栈溢出,辛苦同学们提交语言选择c++,并在代码的第一行加上:

`#pragma comment(linker, "/STACK:1024000000,1024000000") `

 
Output
对于每组数据,首先输出一行”Case #?:”,在问号处应填入当前数据的组数,组数从1开始计算。

对于每次询问,输出从编号为0的零食机出发,必须经过编号为x零食机的路线中,价值总和的最大值。

 
Sample Input
1
6 5
0 1
1 2
0 3
3 4
5 3
7 -5 100 20 -5 -7
1 1
1 3
0 2 -1
1 1
1 5
 
Sample Output
Case #1:
102
27
2
20
 

 
 
这题是把树化为线性去处理的典型题。
对于本题我们要求的是经过从根并经过点s的路径最大权值,即到达该点和该点子树上每个节点的路径总权值里的最大值。这个可以用前缀和求出到每个点的总权值。并且这之中带有权值修改,一下就令人想到线段树。但线段树维护的是一个区间上的值,那怎么把一颗树化为线性呢?那么此时dfs时间戳就派上用场了。我们需要把一棵树用dfs时间戳将这棵树化为一个线性的区间,区间每个点存的是dfs时间戳里的节点所对应的从0根节点到该节点的路径总权值。此时我们要求解点s的从根并经过点s的路径最大权值,就变成了求解pre[s]~last[s]这个区间里所有权值的最大值,而修改某个点u的权值相当于更新pre[u]~last[u]里的所有权值。于是该题就能用线段树维护求解了。
 #pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<iostream>
#include<cstring>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define LL long long
#define INF (1e18)
using namespace std;
struct edg
{
int next,to;
}edge[<<];
struct seg
{
int l,r;
LL maxn,tag;
}segt[<<];
int head[],dfstm[],pre[],last[],n,m,k,u,v,s,T,cnt;
LL value[],sum[],x;
LL max(LL a, LL b)
{
return a>b?a:b;
}
void addedge(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
return ;
}
void dfs(int i,int fa)
{
sum[i]=sum[fa]+value[i];
dfstm[++k]=i;
pre[i]=k;
for(int j=head[i];j!=-;j=edge[j].next)
if(edge[j].to!=fa)
dfs(edge[j].to,i);
last[i]=k;
return ;
}
void init(int i,int l,int r)
{
segt[i]=(seg){l,r,,};
if(l==r)
{
segt[i].maxn=sum[dfstm[l]];
return;
}
int mid=(l+r)>>;
init(i<<,l,mid);
init(i<<|,mid+,r);
segt[i].maxn=max(segt[i<<].maxn,segt[i<<|].maxn);
return ;
}
void pushdown(int i)
{
if(segt[i].tag!=)
{
if(segt[i].l!=segt[i].r)
{
segt[i<<].maxn+=segt[i].tag;
segt[i<<|].maxn+=segt[i].tag;
segt[i<<].tag+=segt[i].tag;
segt[i<<|].tag+=segt[i].tag;
}
segt[i].tag=;
}
return ;
}
void update(int i,int l,int r,LL addval)
{
if(segt[i].l>=l && segt[i].r<=r)
{
segt[i].tag+=addval;
segt[i].maxn+=addval;
return ;
}
pushdown(i);
int mid=(segt[i].l+segt[i].r)>>;
if(mid>=r)
{
update(i<<,l,r,addval);
}
else if(mid<l)
{
update(i<<|,l,r,addval);
}
else
{
update(i<<,l,r,addval);
update(i<<|,l,r,addval);
}
segt[i].maxn=max(segt[i<<].maxn,segt[i<<|].maxn);
return ;
}
LL query(int i,int l,int r)
{
if(segt[i].l>=l && segt[i].r<=r)
{
return segt[i].maxn;
}
pushdown(i);
int mid=(segt[i].l+segt[i].r)>>;
LL ans=-INF;
if(mid>=r)
{
ans=max(ans,query(i<<,l,r));
}
else if(mid<l)
{
ans=max(ans,query(i<<|,l,r));
}
else
{
ans=max(ans,query(i<<,l,r));
ans=max(ans,query(i<<|,l,r));
}
segt[i].maxn=max(segt[i<<].maxn,segt[i<<|].maxn);
return ans;
}
int main()
{
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
clr_1(head);
clr(sum);
cnt=;
k=;
printf("Case #%d:\n",kase);
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(int i=;i<n;i++)
{
scanf("%lld",&value[i]);
}
dfs(,);
init(,,n);
for(int i=;i<=m;i++)
{
scanf("%d",&k);
if(k)
{
scanf("%d",&u);
printf("%lld\n",query(,pre[u],last[u]));
}
else
{
scanf("%d%lld",&u,&x);
update(,pre[u],last[u],x-value[u]);
value[u]=x;
}
}
}
return ;
}

hdu 5692 Snacks(dfs时间戳+线段树)的更多相关文章

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

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

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

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

  3. hdu 3974 dfs时间戳+线段树

    题意: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务. 有若干操作,分配给员工任务以及查询该员工正在执行的任务. 题解: 典型的更新字树的操 ...

  4. hdu-5692 Snacks(dfs序+线段树)

    题目链接: Snacks Problem Description   百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的 ...

  5. HDU5692 Snacks DFS序 线段树

    去博客园看该题解 题目 HDU5692 Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的 ...

  6. HDU3974 Assign the task —— dfs时间戳 + 线段树

    题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...

  7. HDU - 4366 Successor DFS区间+线段树

    Successor:http://acm.hdu.edu.cn/showproblem.php?pid=4366 参考:https://blog.csdn.net/colin_27/article/d ...

  8. Assign the task HDU - 3974(dfs序+线段树)

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  9. HDU 4366 Successor( DFS序+ 线段树 )

    Successor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

随机推荐

  1. 【比赛】STSRM 09

    第一题 题意:n个点,每个点坐标pi属性ai,从右往左将遇到的点向左ai范围内的点消除,后继续扫描. 现可以在扫描开始前提前消除从右往左任意点,问最少消除数(提前+扫描). n,pi,ai<=1 ...

  2. 【BZOJ】1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

    [算法]动态规划 [题解]DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移. 最优化问题中DP往往占据重要地位. f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶 ...

  3. PHP 练习1:新闻发布

    1.新闻发布主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  4. Vuejs - 组件式开发

    初识组件 组件(Component)绝对是 Vue 最强大的功能之一.它可以扩展HTML元素,封装可复用代码.从较高层面讲,可以理解组件为自定义的HTML元素,Vue 的编译器为它添加了特殊强大的功能 ...

  5. 20151024_002_C#基础知识(ArrayList,Hashtable,List,Dictionary)

    1:ArrayList 和 Hashtable(哈希表) 1.1:ArrayList ArrayList list = new ArrayList(); list.Add(); list.AddRan ...

  6. 获取天气api

    http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100通过城市id获得天气数据,xml文件数据,当错误时会有<error>节点http: ...

  7. Sketch VS Photoshop

    参考:http://mp.weixin.qq.com/s?__biz=MjM5NTQ5MjIyMA==&mid=217309554&idx=4&sn=4d6a5239ca813 ...

  8. Part2-HttpClient官方教程-Chapter1-基础

    前言 超文本传输协议(HTTP)可能是当今Internet上使用的最重要的协议.Web服务.网络支持的设备和网络计算的增长继续扩展了HTTP协议在用户驱动的Web浏览器之外的作用,同时增加了需要HTT ...

  9. mongodb-linux-x86_64

    卷 DataDisk 的文件夹 PATH 列表卷序列号为 4A8E-D95CD:.│  1.txt│  GNU-AGPL-3.0│  MPL-2│  README│  THIRD-PARTY-NOTI ...

  10. MVC 从控制器将数据对象赋值给前端JS对象

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...