HDU 5692 (DFS序+线段树)
DFS获得从0到每一个顶点的距离,同时获得L和R数组。两数组为遍历时从i进入再从i出来的序列。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 1e5+; typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n,m;
vector<int> g[maxn];
ll w[maxn];
int index = ;
int L[maxn],R[maxn];
int vis[maxn];
ll d[maxn];
struct node
{
ll maxx;
ll lazy;
};
node T[maxn*];
void dfs(int x,int New)
{
L[x] = index;
for(int i=;i<g[x].size();i++)
{
int v = g[x][i];
if(!vis[v])
{
vis[v] = ;
index++;
d[index] = d[New]+w[v];
dfs(v,index);
}
}
R[x] = index;
}
void build(int q,int l,int r)
{
if(l==r)
{
T[q].maxx = d[l];
T[q].lazy = ;
return;
}
int mid = (l+r)/;
build(q*,l,mid);
build(q*+,mid+,r);
T[q].lazy = ;
T[q].maxx = max(T[q*].maxx,T[q*+].maxx);
}
void ins(int q,int l,int r,int ql,int qr,ll tt)
{
if(ql<=l&&r<=qr)
{
T[q].maxx += tt;
T[q].lazy += tt;
return;
}
if(T[q].lazy)
{
T[q*].maxx += T[q].lazy;
T[q*].lazy += T[q].lazy;
T[q*+].maxx += T[q].lazy;
T[q*+].lazy += T[q].lazy;
T[q].lazy = ;
}
int mid = (l+r)/;
if(ql<=mid) ins(q*,l,mid,ql,qr,tt);
if(mid+<=qr) ins(q*+,mid+,r,ql,qr,tt);
T[q].maxx = max(T[q*].maxx,T[q*+].maxx);
return;
}
ll query(int q,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r)
{
return T[q].maxx;
}
if(T[q].lazy)
{
T[q*].maxx += T[q].lazy;
T[q*].lazy += T[q].lazy;
T[q*+].maxx += T[q].lazy;
T[q*+].lazy += T[q].lazy;
T[q].lazy = ;
}
ll maxx = -inf; //坑点
int mid = (l+r)/;
if(ql<=mid) maxx = max(maxx,query(q*,l,mid,ql,qr));
if(mid+<=qr) maxx = max(maxx,query(q*+,mid+,r,ql,qr));
return maxx;
}
int main()
{
int T,kase = ;cin>>T;
while(T--)
{
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++) g[i].clear();
int xx,xy;
for(int i=;i<=n-;i++)
{
scanf("%d %d",&xx,&xy);
g[xx].push_back(xy);
g[xy].push_back(xx);
}
for(int i=;i<n;i++) scanf("%I64d",&w[i]);
index = ;
memset(d,,sizeof(d));
memset(vis,,sizeof(vis));
memset(L,,sizeof(L));
memset(R,,sizeof(R));
d[] = w[];
vis[] = ;
dfs(,);
build(,,n);
printf("Case #%d:\n",++kase);
int x,y;
ll ttt;
for(int i=;i<=m;i++)
{
scanf("%d %d",&x,&y);
if(x==)
{
printf("%I64d\n",query(,,n,L[y],R[y]));
}
else
{
scanf("%I64d",&ttt);
ll tt = ttt-w[y];
ins(,,n,L[y],R[y],tt);
w[y] = ttt; //坑点
}
}
}
return ;
}
HDU 5692 (DFS序+线段树)的更多相关文章
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- HDU 5877 [dfs序][线段树][序]
/* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
随机推荐
- hdu_3067_小t的游戏(脑洞)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3067 题意:中文,不解释 题解:一看就知道是要找规律的题,都是有循环节的,看代码. #include ...
- Perl资料
一 官网 http://www.perl.org/ 三 资料 http://www.slideshare.net/ggilmour/perl-development-sample-courseware ...
- masonry使用问题
2015年11月3日 coreData的学习练习中复习使用masonry自动布局 masonry自动布局发现问题: 两个控件的相对布局: 如果被参考对象用这个带anchor的属性,就会报这样一个错误: ...
- ProgressDialog
几个方法介绍: 1.setMax() 设置对话框中进度条的最大值. 2.setTile() 设置标题. 3.setProgressStyl() 设置对话框中进度条的样式.例如:环形和水平. 参数: P ...
- sudo su– user
[root@localhost ~] # visudo –f /etc/sudoers 在文件中的root账户下添加需要切换root账户的账户 root ALL=(ALL) ALL user ALL= ...
- C++ 学习之函数重载、基于const的重载
函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载.注意函数重载不能基于不同的返回值类型进行重载. 注意函数重载中的"形参表"不 ...
- CSS样式 初学
CSS样式 参考网站: CSS用法:3种 一:直接样式表 如<p style="color:red;">这是一个段落</p> 二:内部样式表 如:<s ...
- myeclipse中常用的快捷键
存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了) 代码辅助 Alt+/ 快速修复 Ctrl+1 代码格式化 Ctrl+Shi ...
- iOS 6 Passbook 入门 1/2
http://www.raywenderlich.com/zh-hans/23066/ios-6-passbook-%E5%85%A5%E9%97%A8-12 iOS 6 Passbook 入门 1/ ...
- 【转】HBase技术介绍 转载自 http://www.searchtb.com/2011/01/understanding-hbase.html
HBase简介 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. HB ...