点权树的模板题,另外发现树状数组也是可以区间更新的。。

注意在对链进行操作时方向不要搞错

线段树版本

#include<bits/stdc++.h>
using namespace std;
#define maxn 50005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct Edge{int to,next;}edge[maxn<<2];
int a[maxn],head[maxn],tot;
int deep[maxn],fa[maxn],son[maxn],num[maxn];
int top[maxn],fp[maxn],p[maxn],pos;
inline void addedge(int u,int v){edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;}
void dfs1(int u,int pre,int dep){fa[u]=pre;deep[u]=dep;num[u]=1;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==pre) continue;dfs1(v,u,dep+1);num[u]+=num[v];if(son[u]==-1 || num[son[u]]<num[v]) son[u]=v;}
}
void getpos(int u,int sp){top[u]=sp;p[u]=pos++;fp[p[u]]=u;if(son[u]==-1) return;getpos(son[u],sp);for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v!=fa[u] && v!=son[u]) getpos(v,v);}
}int seg[maxn<<2];
void build(int l,int r,int rt){seg[rt]=0;if(l==r) {seg[rt]=a[fp[l]];return;}//注意这里,线段树上坐标为i的点权值是第i个被访问到的点的权值 int m=l+r>>1;build(lson);build(rson);
}
inline void pushdown(int rt){if(seg[rt]) {seg[rt<<1]+=seg[rt];seg[rt<<1|1]+=seg[rt];seg[rt]=0;}
}
void update(int L,int R,int c,int l,int r,int rt){if(L<=l && R>=r){seg[rt]+=c;return;}pushdown(rt);int m=l+r>>1;if(L<=m) update(L,R,c,lson);if(R>m) update(L,R,c,rson);
}
int query(int pos,int l,int r,int rt){if(l==r) return seg[rt];pushdown(rt);int m=l+r>>1;if(pos<=m) return query(pos,lson);else return query(pos,rson);
}
void change(int u,int v,int c){int f1=top[u],f2=top[v];while(f1!=f2){if(deep[f1]<deep[f2]){swap(u,v);swap(f1,f2);}update(p[f1],p[u],c,1,pos,1);u=fa[f1];f1=top[u];}if(deep[u]>deep[v]) swap(u,v);update(p[u],p[v],c,1,pos,1);
}
void init(){tot=pos=0;pos=1;memset(head,-1,sizeof head);memset(son,-1,sizeof son);
}
int main(){int n,m,q,u,v,k;while(scanf("%d%d%d",&n,&m,&q)==3){init();for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}dfs1(1,0,0);getpos(1,1);build(1,pos,1);char op[2];while(q--){scanf("%s",op);if(op[0]=='I') {scanf("%d%d%d",&u,&v,&k);change(u,v,k);}else if(op[0]=='D'){scanf("%d%d%d",&u,&v,&k);change(u,v,-k);}else {scanf("%d",&u);printf("%d\n",query(p[u],1,pos,1));}} }
}

树状数组版本。。果然还是树状数组快一点啊

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 50010
using namespace std;
struct Edge{int to, next;
}edge[MAXN*2];
int head[MAXN], tot;
int deep[MAXN];
int fa[MAXN];
int son[MAXN];
int p[MAXN];
int fp[MAXN];
int top[MAXN];
int num[MAXN];
int pos;
int c[MAXN], n;//树状数组的
void init()
{tot=0;memset(head,-1,sizeof(head));pos=1;//树状数组,编号从1开始 memset(son,-1,sizeof(son));memset(c,0,sizeof(c));
}
void addedge(int u,int v)
{edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;
}
void dfs1(int u, int pre, int d){deep[u] = d;fa[u] = pre;num[u] = 0;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (v != pre){//v不能是父节点 dfs1(v, u, d+1);num[u] += num[v];if (son[u]==-1||num[v]>num[son[u]])son[u] = v;}}
}
void getpos(int u, int sp){top[u] = sp;p[u] = pos++;fp[p[u]] = u;if (son[u] == -1)return;getpos(son[u], sp);for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (v != fa[u] && v != son[u])getpos(v, v);}
} //树状数组
int lowbit(int i){return i&(-i);
}
int sum(int i){int s = 0;while(i<=n){s += c[i];i +=lowbit(i);}return s;
}
void add(int i, int val){while(i>0){c[i]+=val;i-=lowbit(i);}
}
void change(int u, int v, int val){int f1 = top[u], f2 = top[v];while(f1 != f2){if (deep[f1]<deep[f2]){swap(f1, f2);swap(u, v);}add(p[u], val);//树状数组的区间更新原理 add(p[f1]-1, -val);//这儿得减去一个东西 u = fa[f1];f1 = top[u];}if(deep[u]>deep[v])swap(u,v);//默认u是v的祖先 add(p[u]-1, -val);add(p[v], val);
}
int a[MAXN];
int main(){int M, P;while(~scanf("%d%d%d", &n, &M, &P)){int u, v;int C1, C2, K;char op[2];init();for(int i = 1; i<=n; i++)scanf("%d", &a[i]);while(M--){scanf("%d%d", &u, &v);addedge(u, v);addedge(v, u);}dfs1(1, 0, 0);getpos(1, 1);while(P--){scanf("%s", op);if (op[0]=='Q'){scanf("%d", &u);printf("%d\n", sum(p[u])+a[u]);}else {scanf("%d%d%d", &C1, &C2, &K);if (op[0]=='D')K = -K;change(C1, C2, K);}}}
}

转载于:https://www.cnblogs.com/zsben991126/p/10040378.html

hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询相关推荐

  1. 树链剖分边权模板spoj375

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

  2. 【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3)

    正题 luogu 2486 金牌导航 树链剖分-3 题目大意 给你一棵树,让你进行以下操作: 1.把一条路径染上一个颜色 2.查询一条路径上有多少个颜色段 解题思路 用树链剖分把问题转化为链上问题 然 ...

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

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

  4. 树链剖分概念及模板 + 例题 [POJ3237 tree + 软件包管理器]

    文章目录 概念 模板 例题1:软件包管理器 题目 题解 代码实现 例题2:POJ3237 tree 题目 题解 代码实现 概念 树链剖分主要是用于解决以下这两个问题. 1.更改树上点x到点y的最短路径 ...

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

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

  6. hdu 3966( 树链剖分+点权更新)

    题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...

  7. 【树链剖分】【模板】树的统计(P2590)

    小目录 链接 题目描述 样例输入 样例输出 思路 代码 链接 Luogu P2590 题目描述 给出一棵树,对该树进行单点修改,区间查询最大值,区间求和 样例输入 4 1 2 2 3 4 1 4 2 ...

  8. [LuoguU41039]PION后缀自动机 树链剖分+动态开点线段树

    链接 刚开始看出题人题解都吓蒙掉了,还以为是什么难题,结果就一板子题 思路:对每一个文件名开一棵线段树,然后树剖即可 #include<bits/stdc++.h> #define REP ...

  9. 树链剖分求lca模板

    传说中比O(1)还快的求LCA的方法 再加上正向表优化, #include<cstdio> #include<cstring> #include<vector> u ...

最新文章

  1. BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )
  2. python—— 写入错误UnicodeEncodeError的解决办法
  3. AM335x(TQ335x)学习笔记——使用dtb方式启动内核
  4. MacroMedia FreeHand 10中文版
  5. 全球及中国有色金属行业产量规模与未来发展形势展望报告2021版
  6. connection refused_ERR_CONNECTION_REFUSED
  7. [转载]使用.net 2003中的ngen.exe编译.net程序
  8. mybatis $和#源代码分析
  9. 学会用感情营销是最高的智慧
  10. (转)C++ 库汇总(网址+简介)
  11. 系统架构师考试经验分享
  12. java+mysql学科竞赛管理系统(java,web)
  13. jaxen-1.1-beta-6.jar下载,Dom4j的xpath的使用
  14. 中基鸿业人人都要懂的投资理财常识
  15. android 8.1 9.0 10.0 Launcher3禁止拖拽app图标到第一屏
  16. 信创引领丨呼叫中心加速适配国产化
  17. 360 度考核的定义和示例
  18. Backtrader(十二)- 订单 Order -buy、sell、close
  19. 七日杀服务器技能点修改,7日杀作弊模式怎么改技能点 | 手游网游页游攻略大全...
  20. 推荐一个加载动图的网站loading.io

热门文章

  1. STM32F103xC、STM32F103xD和STM32F103xE增强型模块框图 与 时钟树
  2. 人工智能专业国内排名前30的高校,与你想的一样吗?
  3. 谷歌为雇人监听智能助手录音辩护 承诺对用户数据泄露进行调查
  4. 宝马戴姆勒、大众福特 自动驾驶圈又添新团伙
  5. mysql php commit_php mysqli_autocommit()使用实例
  6. 说说Broker服务节点、Queue队列、Exchange交换器?
  7. 001_SpringMVC入门
  8. 使用脚本创建查找修改销毁游戏对象
  9. php flock 都是true_php并发处理的几种方法
  10. activexobject对象不能创建_【设计模式】建造者模式:你创建对象的方式有它丝滑吗?...