树链剖分,点权,单点更改,路径查询。学树链剖分下面这个博文不错

http://blog.csdn.net/y990041769/article/details/40348013

线段树必须写的很熟练才行。注意负数

 #include <cstdio>
#include <vector>
#include <algorithm> using namespace std; const int maxn = 3e4+;
const int INF = 0x3f3f3f3f; /////////////////////////////////////
int topw;
int son[maxn],top[maxn],fa[maxn],siz[maxn],id[maxn],dep[maxn];
int val[maxn],pre_val[maxn]; vector<int> G[maxn]; void dfs_1(int u,int f,int d)
{
son[u] = ;
dep[u] = d;
fa[u] = f;
siz[u] = ;
for(int i=;i<G[u].size();i++)
{
int v = G[u][i];
if(v == f) continue;
dfs_1(v,u,d+);
siz[u] += siz[v];
if(siz[son[u]] < siz[v])
{
son[u] = v;
}
}
} void dfs_2(int u,int tp)
{
top[u] = tp;
id[u] = ++topw;
if(son[u]) dfs_2(son[u],tp);
for(int i=;i<G[u].size();i++)
{
int v = G[u][i];
if(v == fa[u] || v == son[u]) continue;
dfs_2(v,v);
}
} ////////////////////////////////////
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define root 1,topw,1 int sum[maxn<<];
int mx[maxn<<]; void push_up(int rt)
{
sum[rt] = sum[rt<<]+sum[rt<<|];
mx[rt] = max(mx[rt<<],mx[rt<<|]);
} void build(int l,int r,int rt)
{
sum[rt] = ;
mx[rt] = ;
if(l == r)
{
sum[rt] = val[l];
mx[rt] = val[l];
return ;
}
int m = (l+r)>>;
build(lson);
build(rson);
push_up(rt);
} void update(int pos,int add,int l,int r,int rt)
{
if(l == r)
{
sum[rt] = add;
mx[rt] = add;
return ;
}
int m = (l+r)>>;
if(pos <= m) update(pos,add,lson);
else update(pos,add,rson);
push_up(rt);
} int query_sum(int L,int R,int l,int r,int rt)
{
if(L <= l && R >= r)
{
return sum[rt];
}
int m = (l+r)>> , ans = ;
if(L <= m) ans += query_sum(L,R,lson);
if(R > m) ans += query_sum(L,R,rson);
return ans;
} int query_max(int L,int R,int l,int r,int rt)
{
if(L <= l && R >= r)
{
//printf("[%d,%d] rt:%d mx:%d\n",l,r,rt,mx[rt]);
return mx[rt];
}
int m = (l+r)>> , ans = -INF;
if(L <= m) ans = max(ans,query_max(L,R,lson));
if(R > m) ans = max(ans,query_max(L,R,rson));
return ans;
} int Find_sum(int u,int v)
{
int fu = top[u],fv = top[v];
int ans = ;
while(fu != fv)
{
//printf("ans:%d %d %d %d %d\n",ans,u,fu,v,fv);
if(dep[fu] < dep[fv])
{
swap(u,v);
swap(fu,fv);
}
ans += query_sum(id[fu],id[u],root);
u = fa[fu];
fu = top[u];
}
if(u == v)
{
return ans+query_sum(id[u],id[v],root);
}
else{
if(dep[u] < dep[v]) swap(u,v);
return ans+query_sum(id[v],id[u],root);
}
} int Find_max(int u,int v)
{
int fu = top[u],fv = top[v];
int ans = -INF;
while(fu != fv)
{
if(dep[fu] < dep[fv])
{
swap(u,v);
swap(fu,fv);
}
//printf("ans:%d %d %d %d %d\n",ans,u,fu,v,fv);
//printf("q:%d\n",query_max(id[fu],id[u],root));
ans = max(ans,query_max(id[fu],id[u],root));
u = fa[fu];
fu = top[u];
}
if(u == v)
{
return max(ans,query_max(id[u],id[v],root));
}
else{
if(dep[u] < dep[v]) swap(u,v);
return max(ans,query_max(id[v],id[u],root));
}
} ////////////////////////////////////////// int N,Q;
int main()
{
freopen("input.in","r",stdin);
while(~scanf("%d",&N))
{
for(int i=,u,v;i<N;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=;i<=N;i++) scanf("%d",&pre_val[i]);
topw = ;
dfs_1(,,);
dfs_2(,);
for(int i=;i<=N;i++) val[id[i]] = pre_val[i];
build(root); scanf("%d",&Q);
char op[];
int a,b;
while(Q--)
{
scanf("%s%d%d",op,&a,&b);
if(op[] == 'Q')
{
if(op[] == 'M')
{
printf("%d\n",Find_max(a,b));
}else
{
printf("%d\n",Find_sum(a,b));
}
}else
{
update(id[a],b,root);
}
}
for(int i=;i<=N;i++) G[i].clear();
}
}

HYSBZ1036-树链剖分-点权的更多相关文章

  1. BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分 - 点权剖分 - 单点权修改)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分模版题,打的时候注意点就行.做这题的时候,真的傻了,单词拼错检查了一个多小时 ...

  2. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  3. POJ3237 Tree 树链剖分 边权

    POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...

  4. POJ2763 Housewife Wind 树链剖分 边权

    POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...

  5. HDU3669 Aragorn's Story 树链剖分 点权

    HDU3669 Aragorn's Story 树链剖分 点权 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: n个点的,m条边,每个点都 ...

  6. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  7. SPOJ 375 (树链剖分 - 边权剖分 - 修改单边权)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#problem/I 给你一棵有边权的树,有两个操作:一个操作是输出l到 ...

  8. 树链剖分边权模板spoj375

    树链剖分是树分解成多条链来解决树上两点之间的路径上的问题 如何求出树链:第一次dfs求出树上每个结点的大小和深度和最大的儿子,第二次dfs就能将最大的儿子串起来并hash(映射)到线段树上(或者其他数 ...

  9. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  10. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12247   Accepted: 3151 Descriptio ...

随机推荐

  1. R实战 第十二篇:随机数

    由R生成的随机数实际上伪随机数,也就是说,随机数是由某种算法而不是真正的随机过程产生的,随机数生成器需要一个初始值来生成数字,该初始值叫做种子.通过把种子设置为特定的值,可以保证每次运行同一段代码时都 ...

  2. Jenkins- job之间传参

    前言: 本文介绍插件: Parameterized Trigger plugin的具体使用方法. 一.插件介绍 Parameterized Trigger plugin插件可以让你在构建完成时触发新的 ...

  3. H5 video标签的属性

    35-video标签 video标签的属性 src: 用于告诉video标签需要播放的视频地址 autoplay: 用于告诉video标签是否需要自动播放视频 controls: 用于告诉video标 ...

  4. 1003: [ZJOI2006]物流运输 = DP+SBFA

    题意就是告诉你有n个点,e条边,m天,每天都会从起点到终点走一次最短路,但是有些点在某些时间段是不可走的,因此在某些天需要改变路径,每次改变路径的成本是K,总成本=n天运输路线长度之和+K*改变运输路 ...

  5. 斐波那契数列yield表示

    def fib(num): n=0 a,b=0,1 while n<num: print(b) yield a,b=b,a+b n=n+1a=fib(30)next(a)next(a)  

  6. python知识点及面试面试大集合

    题目来源:武sir--一个很有意思的人,点击这儿跳转 一.基础篇 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解 ...

  7. 软件工程(FZU2015) 赛季得分榜,第二回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  8. python3 操作页面上各种元素的方法

    (1)       控制浏览器 ①控制浏览器窗口大小set_window_size(宽,高) 打开浏览器全屏maximize_window() ②控制浏览器后退back().前进forward() ③ ...

  9. 为什么说Java中只有值传递(转载)

    出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...

  10. 模态框 modal data-toggle data-target

    模态框 modal data-toggle data-target   1. Data-*属性 模态框(modal) 触发事件(data-toggle) 触发对象data-target(ID 或类) ...