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. Java实现分布式锁方式

    1.数据库乐观锁 2.redis 3.zookeeper

  2. Ruby on Rails 路由解析

    为了更好的阅读体验.欢迎訪问 作者博客原文 Route是什么 Rails中URL的约定严格基于RESTful风格的.client的请求事实上是在操作一些资源.同一资源的不同的请求动作(GET, POS ...

  3. scikit-learn(project中用的相对较多的模型介绍):2.3. Clustering(可用于特征的无监督降维)

    參考:http://scikit-learn.org/stable/modules/clustering.html 在实际项目中,我们真的非常少用到那些简单的模型,比方LR.kNN.NB等.尽管经典, ...

  4. spark之pycharm开发设置

    方法一: __author__ = 'similarface' import os import sys os.environ['SPARK_HOME']="/Users/similarfa ...

  5. request 请求转发

    package request; import java.io.IOException;import javax.servlet.ServletException;import javax.servl ...

  6. zabbix-agent active 配置自动探测

    1. zabbix-agent 被动模式配置文件: PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_a ...

  7. 【WPF学习笔记】之 System.Exception 对象名 'XXXX' 无效。

    我在运行vs时候发现项目报错,如下图: 报Exception错误,对象名“XXXXXX”无效. 经过调查得知,因为连接数据库的库名写错了,如下: 对应正确数据库的库名: 把库名改正确,问题就解决了.

  8. zeroMQ研究(转)

    偶尔一个机会,了解了下zeroMQ消息队列. 1  ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接 ...

  9. 图像处理之全景拼接---基于sift的全景图像拼接

    http://blog.csdn.net/masibuaa/article/details/9246493#comments

  10. 将參数从PHP传递到JavaScript中

    php: //自己定义数组參数 $newarr = array('a1' => 'a1', 'a2' => 'a2', 'a3' => 'a3'); $config = CJavaS ...