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

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. 【Java并发.4】对象的组合

    到目前为止,我们已经介绍了关于线程安全与同步的一些基础知识.然而,我们并不希望对每一系内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或程序. 4.1 设 ...

  2. 移动前端webApp开发点滴积累20140524

    #webApp开发几点体会(移动前端) ##前言 本文旨在记录本人涉足移动webApp开发的几点体会,欢迎分享与指正. ##再见,IE678 移动设备,Android跟iPhone是主流,即使是win ...

  3. 使用 $(function(){}) 时遇到的一个小bug及解决方法

    在 $(function(){}) 中声明函数,在 $(function(){}) 外调函数,会报错 原因: 页面加载后,会先执行 $(function(){}) 外面的语句,再执行 $(functi ...

  4. js、jquery实现放大镜效果

    在一些电商网站的商品详情页面,都会有放大镜效果,实现起来并不是很困难,今天用了两个小时,写了一个放大镜效果的实例,来分享给大家! 实现的效果大概是这个样子的 预览 先来看一下效果吧,点击下面的链接预览 ...

  5. 协程 IO多路复用

    -----------------------------------------------------------------试试并非受罪,问问并不吃亏.善于发问的人,知识丰富. # # ---- ...

  6. Django之连接多个数据库的相关配置

    01-修改django默认的数据库 # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NA ...

  7. Notepad++远程连接Linux系统

    首先在官网下载 https://notepad-plus-plus.org/news/notepad-7.6.4-released.html 在命令行数输入ifconfig 查看自己的Linux的ip ...

  8. semantic-ui 下拉框

    注意:在使用semantic的下拉框的时候,不仅需要引入semantic.css,还要引入semantic.js,最重要的是引入jquery.否则下拉效果不会显示. 并且,jquery必须先于sema ...

  9. PHP中友好的处理方式

    在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...

  10. 开发神器之phpstorm破解与日常使用

    PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. PhpStorm可随时帮助用 ...