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. Oracle删除死锁进程的方法

    本文实例讲述了Oracle删除死锁进程的方法.分享给大家供大家参考.具体如下: 步骤1:用以下SQL查看进程列表,判断出被锁定的表 复制代码代码如下: SELECT dob.OBJECT_NAME T ...

  2. [转]phpcms 判断用户登录代码

    <!-- 用户登录开始 --> <?php //读取用户信息 $ypzy_userid = param::get_cookie('_userid'); if(!empty($ypzy ...

  3. passwd总结

    1.当前用户是root root用户修改密码 ,直接 passwd[不要输入当前用户密码] 如果修改其他用户密码,需要 passwd 用户名 如: passwd sc 短短的密码,如123也能通过,因 ...

  4. wlcore: firmware chunk too long

    insmod wlcore_sdio.ko 的时候出现的错误 43.767890] Powering on wl12xx [  143.846003] Powering off wl12xx [  1 ...

  5. sql查询百分号的方法

    select * from [tablename] where [col] like '%100/%%' escape '/'

  6. MyBatis SQL配置文件中使用#{}取值为null时却不报错的解决方案。

    原因是因为#{kh_id} 这个参数名为小写,我之前写成了大写{#KH_ID}所以取不到值

  7. cookie使用随笔

    cookie是一种浏览器缓存,可以理解为存放在浏览器上的一种小文件. 大小数目限制: 不同浏览器对于大小和数目均有不一样的限制,大小一般为4k,数目从30~50个(视浏览器类型),以键值对的形式存储, ...

  8. 如何给grldr.mbr和grldr改名

    grldr修改方法: 比如要把grldr 改成gzldr :1.先把文件名改成gzldr:2.用ultraedit或winhex打开gzldr:3.虽然文本框全都是乱码,别管它,把光标定位在右边文本框 ...

  9. 快学Scala-第五章 类

    知识点: 1.简单类和无参方法 class Counter { private var value = 0 //必须初始化字段 def increment() { value += 1} //方法默认 ...

  10. Android中自定义veiw使用Java中的回调方法

    //------------------MainActivity----中---------------------------------- import android.os.Bundle;imp ...