HDU5692 Snacks

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

题解:

dfs序+线段树

题目要求修改点值和从0出发经过s点的最大权值和。

实质是求s点的子树中dis最大的,因为某一子树dfs序是连续的,所以该问题成了区间求最大值和区间修改。

修改某个点等价于将以这个点为根的最大值加上一个数。

代码:WA的..没调完...

WA的原因

1、修改错点了,应该是价值改,我改的价值的累加和....

2、修改完区间后...点没修改...

3、没用long long

4、md目前还是WA的。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200002
using namespace std;
int t,n,m,od,sumedge,tim_node,kis,cnt;
int head[maxn],bf[maxn],l[maxn],r[maxn];
long long dis[maxn],ans[maxn],sum[maxn]; struct TREE{
int l,r;
long long maxx,s;
}tr[maxn<<]; struct Edge{
int x,y,nxt;
Edge(int x=,int y=,int nxt=):
x(x),y(y),nxt(nxt){}
}edge[maxn<<]; inline void add(int x,int y){
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
} void dfs(int x,int fa){
bf[tim_node]=x;l[x]=tim_node++;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==fa)continue;
dis[v]+=dis[x];
dfs(v,x);
}
r[x]=tim_node-;
} inline void pushup(int p){
tr[p].maxx=max(tr[p<<].maxx,tr[p<<|].maxx);
} inline void pushdown(int rt){
if(tr[rt].s==)return;
tr[rt<<].s+=tr[rt].s;tr[rt<<|].s+=tr[rt].s;
tr[rt<<].maxx+=tr[rt].s;tr[rt<<|].maxx+=tr[rt].s;
tr[rt].s=;
} void build(int rt,int l,int r){
tr[rt].l=l;tr[rt].r=r;
if(l==r){
tr[rt].maxx=dis[bf[l]];
return;
}
int mid=(l+r)>>;
build(rt<<,l,mid);build(rt<<|,mid+,r);
pushup(rt);
} void change(int rt,int l,int r,int qx,int qy,int z){
if(qx<=l&&qy>=r){
tr[rt].maxx+=z;
tr[rt].s+=z;
return;
}
int mid=(l+r)>>;
if(qy<=mid)change(rt<<,l,mid,qx,qy,z);
else if(qx>mid)change(rt<<|,mid+,r,qx,qy,z);
else {
change(rt<<,l,mid,qx,mid,z);
change(rt<<|,mid+,r,mid+,qy,z);
}
} long long query(int rt,int l,int r,int qx,int qy){
pushdown(rt);
if(qx<=l&&qy>=r)return tr[rt].maxx;
int mid=(l+r)>>;
if(qy<=mid)return query(rt<<,l,mid,qx,qy);
else if(qx>mid)return query(rt<<|,mid+,r,qx,qy);
else return max(query(rt<<,l,mid,qx,mid),query(rt<<|,mid+,r,mid+,qy));
} int main(){
scanf("%d",&t);
while(t--){
memset(head,,sizeof(head));
sumedge=;tim_node=;cnt=;
scanf("%d%d",&n,&m);
int x;long long y;
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=;i<n;i++){
cin>>dis[i];sum[i]=dis[i];
}
dfs(,-);
build(,,n-);
for(int i=;i<=m;i++){
scanf("%d",&od);
if(od==){
scanf("%d%lld",&x,&y);
change(,,n-,l[x],r[x],y-sum[x]);
sum[x]=y;
}else {
scanf("%d",&x);
ans[++cnt]=query(,,n-,l[x],r[x]);
}
}
if(cnt){
printf("Case #%d:\n",++kis);
for(int i=;i<=cnt;i++)printf("%lld\n",ans[i]);
}
}
return ;
}

HDU5692 Snacks的更多相关文章

  1. HDU5692 Snacks DFS序 线段树

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

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

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

  3. HDU5692 Snacks DFS+线段树

    分析:一棵以1为根的有根树,然后每个点维护从根到当前节点的路径和,当修改一个点时 只会影响的子树的和,最优值也是子树最大的值 #include <cstdio> #include < ...

  4. 【hdu5692】Snacks

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

  5. hdu 5692 Snacks 线段树+dfs

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

  6. Snacks

    Snacks 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5692 dfs序+线段树 这道题涉及到对整棵树的值修改,考虑将树状结构用dfs ...

  7. HDU5692(线段树+dfs序)

    Snacks Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  8. hdu5692【dfs序】【线段树】

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

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

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

随机推荐

  1. HDFS源码分析数据块复制监控线程ReplicationMonitor(一)

    ReplicationMonitor是HDFS中关于数据块复制的监控线程,它的主要作用就是计算DataNode工作,并将复制请求超时的块重新加入到待调度队列.其定义及作为线程核心的run()方法如下: ...

  2. HDFS源码分析数据块汇报之损坏数据块检测checkReplicaCorrupt()

    无论是第一次,还是之后的每次数据块汇报,名字名字节点都会对汇报上来的数据块进行检测,看看其是否为损坏的数据块.那么,损坏数据块是如何被检测的呢?本文,我们将研究下损坏数据块检测的checkReplic ...

  3. 初识vue-01

    一.属性和方法 vue自定义的一些数据和方法需要绑定到实例的不同属性上面去例如数据都要绑定要data属性,方法都要绑定到methods方法实例上的data和methods里面的key值会自动挂载到vu ...

  4. 03 redis之string类型命令解析

    Redis字符串类型的操作 set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , ...

  5. PowerBuilder -- 保存图片

    String ls_path, ls_file_name, ls_filter, ls_errInt li_ret, li_loop, li_i, li_file, li_bytesLong ll_f ...

  6. WCF: 以Json格式返回对象

    1.先建一个WCF Service 建一个ServiceContract接口 1 [ServiceContract] public interface IJsonWCFService { /// &l ...

  7. 在ios中使用单例模式编程

    本文转载至 http://blog.csdn.net/remote_roamer/article/details/7107007     1.    @implementation Singleton ...

  8. 自动化测试,基于selenium/appnium 学习

    1. 搭建环境,配置java,安装tomcat 7.0,运行eclipse

  9. 链表的C++实现

      有的时候,处于内存中的数据并非连续的.那么这时候.我们就须要在数据结构中加入一个属性.这个属性会记录以下一个数据的地址.有了这个地址之后.全部的数据就像一条链子一样串起来了,那么这个地址属性就起到 ...

  10. Mongo 分组后排序取时间最大的一整条数据对象

    db.getCollection('product_protocol_new').aggregate([ {$sort:{"end_date":-1}}, {$group:{ _i ...