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 ...
随机推荐
- mysql的binlog
mysql> show global variables like '%bin%'; +---------------------------------+------------------- ...
- POJ 3225 Help with Intervals
U:把区间[l,r]覆盖成1I:把[0,l-1][r+1,∞]覆盖成0D:把区间[l,r]覆盖成0C:把[0,l-1][r+1,∞]覆盖成0 , 且[l,r]区间0/1互换(即异或)S:[l,r]区间 ...
- Pogo-Cow
题目大意: 给出直线上N个点的坐标和分数,任意选一个点出发,每次只能跳到另外一个点上并获得相应的分数,且每次跳的方向要相同,本次跳的距离不小于上次跳的距离. 求最大得分. N<=1000. ...
- u-boot 之配置分析 (2)
Makefile简要分析所有这些目录的编译连接都是由顶层目录的makefile来确定的. 1.在makefile中有: unconfig: @rm -f $(obj)include/config.h ...
- JSON:org.json的基本用法
java中用于解释json的主流工具有org.json.json-lib与gson,本文介绍org.json的应用. 官方文档: http://www.json.org/java/ http://de ...
- 分布式一致性原理—CAP
背景 随着分布式事务的出现,传统的单机事务模型(ACID)已经无法胜任,尤其是对于一个高访问量.高并发的互联网分布式系统来说. 如果我们要求严格一致性,很可能就需要牺牲掉系统的可用性,反之亦然.但两者 ...
- iOS中类方法的作用
类方法,这意味着你将它发送给类,而不是对象实例. 因为不是发送给一个实例,所以你不能使用任何实例变量,你只能做一些通用性的事情. 实际上类方法只用于两种情况: 1.创建事物,比如创建一个特殊格式的字符 ...
- 模拟iOS系统原生导航条隐藏或显示动画
借UIView动画,使更改导航条的hidden属性这一过程动起来.悦德财富:https://yuedecaifu.com 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- C/C++学习之基础-001
1.C++虚函数的工作原理 虚函数(virtual function)需要虚函数表(virtual table)才能实现.如果一个类有函数声明成虚拟的,就会生成一个虚函数表,存放这个类的虚函数地址.若 ...
- LINQ基础 之 LINQ TO SQL (二)
配置LINQ TO SQL 首先添加一个Linq to sql文件,以.dbml结尾的文件.无法把表拖拽到.dbml文件中,提示“所选对象使用不支持的数据提供程序” 解决方案 在服务器资源管理器中右键 ...