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 ...
随机推荐
- 判断数据库内容,在页面显示自定义数据case when
判断数据库内容,在页面显示自定义数据 case when...then ...else...end 比如:数据库内容是这样: 通过sql语句判断,数据库的name字段,内容是月桂的,显示嫦娥,其他的显 ...
- CRF条件随机场简介
CRF(Conditional Random Field) 条件随机场是近几年自然语言处理领域常用的算法之一,常用于句法分析.命名实体识别.词性标注等.在我看来,CRF就像一个反向的隐马尔可夫模型(H ...
- 增加JVM虚拟机内存,防止内存溢出
JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M -XX:MaxNewSize=256m
- 基于百度定位及天气获取的DEMO
demo基于百度定位APIv4.0版.新浪天气(不用查询城市代码). 需求: 1.button实现触发定位监听和天气捕获 2.两个textview 分别显示详细地址.天气. 界面很简陋,侧重功能实现. ...
- JavaScript中Date的一些细节
对于开发人员来说,Date有时候或许会很重要,我们可以通过new Date()来创建一个日期对象.例如: var start = new Date(), //获取当前时间 today = new Da ...
- HTML参考
HTML Basic Document <html> <head> <title>Document name goes here</title> < ...
- iOS之沙盒机制和如何获取沙盒路径
iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒.每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme.沙盒里面的文件可以是照片.声音文件. ...
- iis提示“另一个程序正在使用此文件,进程无法访问。(异常来自HRESULT:0x80070020)
看看IIS的网站,惊人的发现default web site是停止状态.印象中没有停止它啊.右键->管理网站->启动.点击启动后居然弹出:“另一个程序正在使用此文件,进程无法访问.(异常来 ...
- c规范(2)
一:对齐 1 程序的分界符' {'和' }'应独占一行并且位于同一列,同时与引用它们的语句左对齐. 2 { }之内的代码块在' {'右边数格处左对齐. 二:注释 注释通常用于:( 1)版本.版权声明 ...
- mp3文件 ID3v2 帧标识的含义
mp3文件 ID3v2 帧标识的含义 Declared ID3v2 frames The following frames are declared in this draft. 4.20 AENC ...