题目链接:

Snacks

Problem Description
 

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

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

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

 
Input
 

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

对于每组数据,包含两个整数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求出距离并弄成线段树,l[x],r[x]分别表示x的子树节点的左右区间,每次修改[l[x],r[x]]这个区间,用线段树的区间修改,然后就好啦; AC代码:
#include <bits/stdc++.h>
/*
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
*/
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
const LL mod=1e9+;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e5+;
int n,m,head[N],l[*N],r[*N],cnt,num;
LL dis[N],b[N],va[N];
struct Edge
{
int to,next;
}edge[*N];
void add_edge(int s,int e)
{
edge[cnt].next=head[s];
edge[cnt].to=e;
head[s]=cnt++;
}
void dfs(int x,int fa)
{
num++;
b[num]=dis[x];
l[x]=num;
for(int i=head[x];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if(y!=fa)
{
dis[y]=dis[x]+va[y];
dfs(y,x);
}
}
r[x]=num;
}
struct Tree
{
int l,r;
LL ans,lazy;
}tr[*N];
void pushup(int o)
{
tr[o].ans=max(tr[*o].ans,tr[*o+].ans);
}
void pushdown(int o)
{
if(tr[o].lazy)
{
tr[*o].ans+=tr[o].lazy;
tr[*o+].ans+=tr[o].lazy;
tr[*o].lazy+=tr[o].lazy;
tr[*o+].lazy+=tr[o].lazy;
tr[o].lazy=;
}
}
void build(int o,int L,int R)
{
tr[o].l=L;
tr[o].r=R;
tr[o].lazy=;
if(L>=R)
{
tr[o].ans=b[L];
return ;
}
int mid=(L+R)>>;
build(*o,L,mid);
build(*o+,mid+,R);
pushup(o);
}
void update(int o,int L,int R,LL val)
{
if(L<=tr[o].l&&R>=tr[o].r)
{
tr[o].ans=tr[o].ans+val;
tr[o].lazy=tr[o].lazy+val;
return ;
}
int mid=(tr[o].l+tr[o].r)>>;
pushdown(o);
if(R<=mid)update(*o,L,R,val);
else if(L>mid)update(*o+,L,R,val);
else
{
update(*o,L,mid,val);
update(*o+,mid+,R,val);
}
pushup(o);
}
LL query(int o,int L,int R)
{
if(L<=tr[o].l&&tr[o].r<=R)return tr[o].ans;
int mid=(tr[o].l+tr[o].r)>>;
pushdown(o);
if(R<=mid)return query(o*,L,R);
else if(L>mid)return query(o*+,L,R);
else return max(query(*o,L,mid),query(*o+,mid+,R));
}
int main()
{
int t;
scanf("%d",&t);
int Case=;
while(t--)
{
printf("Case #%d:\n",Case++);
cnt=;
num=;
mst(head,-);
scanf("%d%d",&n,&m);
int u,v;
Riep(n-)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
Riop(n)scanf("%I64d",&va[i]);
dis[]=va[];
dfs(,-);
build(,,num);
int flag,x,y;
Riep(m)
{
scanf("%d",&flag);
if(flag)
{
scanf("%d",&x);
printf("%I64d\n",query(,l[x],r[x]));
}
else
{
scanf("%d%d",&x,&y);
update(,l[x],r[x],(LL)y-va[x]);
va[x]=(LL)y;
}
}
}
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 5692 Snacks(dfs时间戳+线段树)

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

  4. HDU5692 Snacks DFS序 线段树

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

  5. 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 ...

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

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

  7. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  8. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  9. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

随机推荐

  1. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  2. Innodb的事务与日志 & JTA事务

    InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的 通过   行多版本控制 MyISAM                  Innodb 事物支持 :   不支持       ...

  3. 转载:CSS3 圆角(border-radius)

    前缀 例1 例2:无边框 书写顺序 其它 支持性 值:半径的长度 前缀 -moz(例如 -moz-border-radius)用于Firefox -webkit(例如:-webkit-border-r ...

  4. chrome浏览器下用jQuery的load函数来跨域加载页面,响应状态status为(canceled)是什么情况? JSON和JSONP,也许你会豁然开朗,含jQuery用例

    http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 问题来源:http://q.cnblogs.com ...

  5. mac 开发必备软件(不断update ing...)

    整理下mac环境下, 开发必备的一些软件吧, 由于不断要更新ing, 用到啥就写啥~球轻拍 1.host 绑定切换神器 a.gas mask : 只能切换单个自定义的host文件 b.ihosts(推 ...

  6. Django官方文档学习1——第一个helloworld页面

    Django 1.10官方文档:https://docs.djangoproject.com/en/1.10/intro/tutorial01/ 1.查看django版本 python -m djan ...

  7. Java异常处理中finally中的return会覆盖catch语句中的return语句

    Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...

  8. Hadoop on Mac with IntelliJ IDEA - 9 解决Type mismatch in value from map问题

    修改陆喜恒. Hadoop实战(第2版)5.3排序的代码时遇到IO异常. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 异常具体信息如下 ...

  9. 如何在DigitalOcean安装Ghost

    查看原文: http://leancodingnow.com/how-to-install-ghost-on-digital-ocean-vps/ 这篇文章主要讲一下如何在DigitalOcean V ...

  10. DCEF3 相关资料

    DCEF3 调用 js http://www.cnblogs.com/Delphi-Farmer/p/4103708.html interface uses ceflib;//其它 type //这里 ...