HDU 5692 线段树+dfs序
Snacks
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1779 Accepted Submission(s): 427
个零食机,零食机之间通过n−1
条路相互连通。每个零食机都有一个值v
,表示为小度熊提供零食的价值。
由于零食被频繁的消耗和补充,零食机的价值v
会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。
为小度熊规划一个路线,使得路线上的价值总和最大。
,表示有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") `
对于每次询问,输出从编号为0的零食机出发,必须经过编号为x
零食机的路线中,价值总和的最大值。

/******************************
code by drizzle
blog: www.cnblogs.com/hsd-/
^ ^ ^ ^
O O
******************************/
#include<bits/stdc++.h>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
#define A first
#define B second
const int mod=;
const int MOD1=;
const int MOD2=;
const double EPS=0.00000001;
//typedef long long ll;
typedef __int64 ll;
const ll MOD=;
const int INF=;
const ll MAX=1ll<<;
const double eps=1e-;
const double inf=~0u>>;
const double pi=acos(-1.0);
typedef double db;
typedef unsigned int uint;
typedef unsigned long long ull;
int T,n,m,x,judge,nedge=,dfn, y;
struct node
{
int ed;
int pre;
} N[];
int pre[],in[],out[];
ll v[];
ll seq[];
ll fuck;
struct tree
{
int l,r;
ll lazy;
ll maxn;
} tree[];
inline void add(int st,int ed)
{
nedge++;
N[nedge].ed=ed;
N[nedge].pre=pre[st];
pre[st]=nedge;
}
inline void getdfs(int x,int y,ll s)
{
s+=v[x];
in[x]=++dfn;
seq[dfn]=s;
for(int i=pre[x]; i; i=N[i].pre)
{
if(N[i].ed!=y)
{
getdfs(N[i].ed,x,s);
}
}
out[x]=dfn;
}
inline void pushdown(int root)
{
if(tree[root].lazy==) return;
tree[root<<].lazy+=tree[root].lazy;
tree[root<<|].lazy+=tree[root].lazy;
tree[root<<].maxn+=tree[root].lazy;
tree[root<<|].maxn+=tree[root].lazy;
tree[root].lazy=;
}
inline void buildtree(int root,int left,int right)
{
tree[root].l=left;
tree[root].r=right;
tree[root].lazy=;
if(left==right)
{
tree[root].maxn=seq[left];
return ;
}
int mid=(left+right)>>;
buildtree(root<<,left,mid);
buildtree(root<<|,mid+,right);
tree[root].maxn=max(tree[root<<].maxn,tree[root<<|].maxn);
}
inline void updata(int root,int in,int out,ll after)
{
if(in==tree[root].l&&tree[root].r==out)
{
tree[root].lazy+=after;
tree[root].maxn+=after;
return ;
}
pushdown(root);
int mid=(tree[root].l+tree[root].r)>>;
if(out<=mid)
updata(root<<,in,out,after);
else
{
if(in>mid)
updata(root<<|,in,out,after);
else
{
updata(root<<,in,mid,after);
updata(root<<|,mid+,out,after);
}
}
tree[root].maxn=max(tree[root<<].maxn,tree[root<<|].maxn);
}
inline ll query(int root,int in,int out)
{
if(in==tree[root].l&&tree[root].r==out)
{
return tree[root].maxn;
}
pushdown(root);
int mid=(tree[root].l+tree[root].r)>>;
if(out<=mid)
return query(root<<,in,out);
else
{
if(in>mid)
return query(root<<|,in,out);
else
return max(query(root<<,in,mid),query(root<<|,mid+,out));
}
}
void init()
{
memset(tree,,sizeof(tree));
memset(N,,sizeof(N));
memset(pre,,sizeof(pre));
memset(in,,sizeof(in));
memset(out,,sizeof(out));
memset(v,,sizeof(v));
memset(seq,,sizeof(seq));
nedge=;
dfn=;
}
int main()
{
scanf("%d",&T);
for(int i=; i<=T; i++)
{
init();
scanf("%d %d",&n,&m);
for(int j=; j<n; j++)
{
scanf("%d %d",&x,&y);
x++;
y++;
add(x,y);
add(y,x);
}
for(int j=; j<=n; j++)
scanf("%I64d",&v[j]);
getdfs(,,);
buildtree(,,n);
printf("Case #%d:\n",i);
for(int j=; j<=m; j++)
{
scanf("%d %d",&judge,&x);
if(judge==)
{
scanf("%I64d",&fuck);
x++;
ll exm=fuck;
fuck=fuck-v[x];
updata(,in[x],out[x],fuck);
v[x]=exm;
}
else
{
x++;
printf("%I64d\n",query(,in[x],out[x]));
}
}
}
return ;
}
HDU 5692 线段树+dfs序的更多相关文章
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- hdu 5039 线段树+dfs序
http://acm.hdu.edu.cn/showproblem.php?pid=5039 给定一棵树,边权为0/1.m个操作支持翻转一条边的权值或者询问树上有多少条路径的边权和为奇数. 用树形df ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数
R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3306】树 线段树 + DFS序
3306: 树 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 792 Solved: 262[Submit][Status][Discuss] De ...
随机推荐
- 使用 JavaScript 修改浏览器 URL 地址栏
现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...
- excel的变量
因需要定制游戏的公式,公式是以一个系数乘以等级,我想达到修改系数,每个等级对应的值就立即显示出来, 但把系数写在一个单元格,一拉,系数单元格也会跟着增长行数--不是我想要的: 但只要把系数单元格改成变 ...
- select2 插件
官网:http://select2.github.io/ Select2是基于jQuery的一个插件,没有引用jQuery,是没有效果的 1.在实现给select2添加placeholder效果的 ...
- Exif的Orientation信息说明
EXIF Orientation 参数让你随便照像但都可以看到正确方向的照片而无需手动旋转(前提要图片浏览器支持,Windows 自带的不支持) 这个参数在佳能.尼康相机照的照片是自带的,但我的奥林巴 ...
- NOIP 2013 提高组 day2 积木大赛
积木大赛 描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第
- POJ 2480 求每一个数对于n的最大公约数的和
这里是枚举每一个最大公约数p,那么最后求的是f(n) = sigma(p*phi(n/p)) phi()为欧拉函数 这里可以试着算一下,然后会发现这个是积性函数的 那么只要考虑每一类质数分开算, ...
- 神州通,我看行---K2用户交流会华南站
主题:K2高级移动信息化解决方案DBToApp开发工具 嘉宾:神州通在线 张德阔 移动办公APP开发≠一般APP开发,你知道这几种企业管理移动APP开发模式吗? 原生APP开发模式Native 具有最 ...
- subline快捷键
折叠所有代码: 按ctrl+k,再按ctrl+1 展开所有代码: 按ctrl+k,再按ctrl+j 折叠此处代码: ctrl+shift+[ 展开此处代码: ctrl+shift+]
- 自定义圆的半径attr.xml
<?xml version="1.0" encoding="utf-8"?><resources> <declare-sty ...
- mybatis多对一关联的两种方式
第一个种是Address找到自己的user_id,扔给User,让User自己去再查一次,即使在有缓存的前提下,每遇到一个新的user_id,就会查一次,对比hibernate的话,相当于多对一eag ...