Snacks

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

Problem Description
百度科技园内有n个零食机,零食机之间通过n−1条路相互连通。每个零食机都有一个值v,表示为小度熊提供零食的价值。
由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。
为小度熊规划一个路线,使得路线上的价值总和最大。

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
Source
中文题  题意不解释
修改每个节点的权值  改变的是这个点的子树中的点到根节点的价值和
求根节点路过这个点的路径的最大和  就是求根节点到这个点已经这个点的子树中的那个最大价值和
我们就可以用DFS序 得到每个点的时间戳  将这个时间戳转化为线段树 修改一个点的权值 就相当他区间修改 修改这个区间的权值
查询也就是查询区间的最大值
 
 #pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string.h>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
const double PI=acos(-1.0);
const double eps=0.0000000001;
const int INF=1e9;
const int N=+;
int head[N];
int tot;
ll a[N];
ll b[N];
int n,m;
struct NOde{
int l,r;
ll val;
ll lazy;
}tree[N*];
struct node{
int to,next;
}edge[N<<];
int L[N],R[N];
int time;
ll dis[N];
void init(){
memset(head,-,sizeof(head));
tot=;
time=;
}
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void DFS(int x,int fa){
L[x]=++time;
b[time]=x;
for(int i=head[x];i!=-;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
a[v]=a[x]+a[v];
DFS(v,x);
}
R[x]=time;
}
void pushdown(int pos){
if(tree[pos].lazy){
tree[pos<<].val+=tree[pos].lazy;
tree[pos<<|].val+=tree[pos].lazy;
tree[pos<<].lazy+=tree[pos].lazy;
tree[pos<<|].lazy+=tree[pos].lazy;
tree[pos].lazy=; }
}
void build(int left,int right,int pos){
// cout<<55<<endl;
tree[pos].l=left;
tree[pos].r=right;
tree[pos].lazy=;
int mid=tree[pos].l+tree[pos].r>>;
if(tree[pos].l==tree[pos].r){
tree[pos].val=a[b[left]];
return ;
}
build(left,mid,pos<<);
build(mid+,right,pos<<|);
tree[pos].val=max(tree[pos<<].val,tree[pos<<|].val); }
void update(int left,int right,int pos,ll x){
if(tree[pos].l==left&&tree[pos].r==right){
tree[pos].lazy+=x;
tree[pos].val+=x;
return ;
}
pushdown(pos);
int mid=(tree[pos].l+tree[pos].r)>>;
if(mid>=right)update(left,right,pos<<,x);
else if(mid<left)update(left,right,pos<<|,x);
else{
update(left,mid,pos<<,x);
update(mid+,right,pos<<|,x);
}
tree[pos].val=max(tree[pos<<].val,tree[pos<<|].val);
}
ll query(int left,int right,int pos){
if(tree[pos].l==left&&tree[pos].r==right){
return tree[pos].val;
}
pushdown(pos);
int mid=(tree[pos].l+tree[pos].r)>>;
if(mid>=right){
return query(left,right,pos<<);
}
else if(left>mid){
return query(left,right,pos<<|);
}
else{
return max(query(left,mid,pos<<),query(mid+,right,pos<<|));
}
}
int main(){
int t;
scanf("%d",&t);
int Case=;
while(t--){
init();
scanf("%d%d",&n,&m);
int u,v;
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(int i=;i<n;i++){
scanf("%I64d",&a[i]);
dis[i]=a[i];
}
DFS(,-);
build(,time,);
int flag;
int x;
ll y;
printf("Case #%d:\n",Case++);
while(m--){
scanf("%d",&flag);
if(flag==){
scanf("%d%I64d",&x,&y);
update(L[x],R[x],,(ll)y-dis[x]);
dis[x]=y;
}
else{
scanf("%d",&x);
ll ans=query(L[x],R[x],);
printf("%I64d\n",ans);
} } }
}

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. HDU5692 Snacks DFS序 线段树

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

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

    题目链接: 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. 学习笔记-java IO流总结 转载

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  2. Oracle Sequence不设置cache参数的几个潜在问题(转载)

    转载于 http://www.uml.org.cn/sjjm/201204065.asp 在Oracle中,我们没有MYSQL和SQL                           Server ...

  3. Ubuntu14.4安装mysql

    一.安装 apt-get install mysql-server mysql-client 设置用户名和密码 二.检查 sudo service mysql restart 三.支持 1.apach ...

  4. HDU_5734_数学推公式

    题意:给一个向量W={w1,w2……,wn},和一个向量B,B的分量只能为1和-1.求||W-αB||²的最小值. 思路:一来一直在想距离的问题,想怎么改变每一维的值才能使这个向量的长度最小,最后无果 ...

  5. 查找java文件

    想要在eclipse里找一个类文件,可以用快捷键CTRL + SHIFT + R,但是有些文件是jar包里的类文件,可以用下图方法,创建一个变量,然后按住CTRL键,点击类名称 这样就找到jar文件了

  6. gitlab 第1次提交代码到1个新仓库

    1.如果是本地刚刚搭建好git环境,第一次和gitlab服务器产生连接 参照这个文 https://www.cnblogs.com/kaerxifa/p/10929098.html 2.已经和gitl ...

  7. 图像处理中创建CDib类时无法选择基类类型时怎么办

    图像处理中创建CDib类时无法选择基类类型时怎么办? 类的类型选择Generic Class 在下面的篮筐里输入CObject就行了

  8. vino-server服务是啥服务

    近期接手一个项目,开始梳理服务器,突然发现有个进程是开启5900远程桌面端口的, 在不知情的情况下怕被人给利用了,啥也不说,先干掉再说. server端开启vino-server,允许别人查看自己的桌 ...

  9. web前端学习总结--JQuery

    jQuery 什么是jQuery jQuery是一个优秀的JavaScript框架,一个轻量级的JS库. 它封装了JS.CSS.DOM,提供了一致的.简洁的API. 兼容CSS3,及各种浏览器 使用户 ...

  10. 弹层蒙版(mask),ios滚动穿透,我们项目的解决方案

    问题描述 项目开发遇到一个ios独有的问题,在wkwebview中稳定复现 问题: 弹出一个蒙版,当在蒙版上面滑动的时候蒙版后面的内容滚动了 这当然是ios的bug,但是经过我们测试iphone7也会 ...