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序+线段树)的更多相关文章

  1. hdu 5692(dfs序+线段树,好题)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  3. HDU 5877 [dfs序][线段树][序]

    /* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...

  4. Assign the task HDU - 3974 (dfs序 + 线段树)

    有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...

  5. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  6. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  7. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  8. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  9. BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)

    题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...

随机推荐

  1. HDU2519:新生晚会

    Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?   ...

  2. C#输出日历

    用C#输出日历,此功能可用于Ajax方式列出计划日程相关的内容,由于是C#控制输出,可以方便加上自己需要的业务处理逻辑. 1.控制台输出: using System; namespace 控制台日历 ...

  3. Winsock SPI-Socks5-SSL

  4. openCV(一)---将openCV框架导入iOS工程中

    开发环境: Xcode 6.4   openCV for iOS 3.0    配置openCV开发环境 在OpenCV官网中下载OpenCV开发包(官网地址:http://opencv.org/) ...

  5. sql server字段是逗号分割的id,关联明细表查询

    有时候一张表的一个字段是以逗号分割的一个字符串,分割的数字是明细表的主键id. 关联明细表查询可以这样做: ) ) --这是把areanos字段赋值给@areanos变量 set @areanos=' ...

  6. 【中国剩余定理】 poj 1006

    生理周期  简单模拟 对于超出23 * 28 * 33(21252)时进行求余运算即可. #include<stdio.h> int main() { //freopen("in ...

  7. ios开发使用lipo命令合并真机库和模拟器库

    在开发ios时,我们经常会遇到编译两套库文件,使用模拟器时链接模拟器库,使用真机时使用真机库,这样操作会对后期的维护带来麻烦,所以Apple提供了一个把多个不同平台的.a库文件合并成一个适用于多平台的 ...

  8. Struts2 请求数据的自动封装 及 自定义转换器类

    请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...

  9. C语言根据函数名调用对应的函数

    通过函数指针定义,调用时加上参数 struct Command { const char *name; const char *desc; // return -1 to force monitor ...

  10. NSUserDefault -- synchronize 浅析

    NSUserDefault的使用比较简单:NSUserDefaults *mySettingData = [NSUserDefaults standardUserDefaults];  创建NSUse ...