树剖模板by fcdalao
#include<bits/stdc++.h>
using namespace std;
const int MX=;
struct Edge{int to,nxt;}e[*MX];
struct node{int mx;long long sum;}t[*MX];
int n,Index,fir[MX],fa[MX],dfn[MX],dep[MX],siz[MX],son[MX],Top[MX],w[MX],bel[MX],dfs_cnt;
inline void ins(int u,int v){e[++Index]=(Edge){v,fir[u]},fir[u]=Index;}
void dfs1(int x){
siz[x]++,dep[x]=dep[fa[x]]+;
for(int i=fir[x];i;i=e[i].nxt)if(e[i].to!=fa[x]){
fa[e[i].to]=x;
dfs1(e[i].to);
siz[x]+=siz[e[i].to];
if(siz[e[i].to]>siz[son[x]])son[x]=e[i].to;
}
}
void dfs2(int x){
Top[x]=(son[fa[x]]==x)?Top[fa[x]]:x;
dfn[x]=++dfs_cnt,bel[dfs_cnt]=x;
if(!son[x])return;
dfs2(son[x]);
for(int i=fir[x];i;i=e[i].nxt)if(e[i].to!=fa[x]&&e[i].to!=son[x]){
dfs2(e[i].to);
}
}
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
inline void push_up(int o){
t[o].mx=max(t[ls(o)].mx,t[rs(o)].mx);
t[o].sum=t[ls(o)].sum+t[rs(o)].sum;
}
void build(int L,int R,int o){
if(L==R){t[o].sum=t[o].mx=w[bel[L]];return;}
int mid=L+R>>;
build(L,mid,ls(o)),build(mid+,R,rs(o));
push_up(o);
}
void updata(int L,int R,int o,int x,int v){
if(L==R){t[o].mx=t[o].sum=v;return;}
int mid=L+R>>;
if(x<=mid)updata(L,mid,ls(o),x,v);
else updata(mid+,R,rs(o),x,v);
push_up(o);
}
long long query(int L,int R,int o,int l,int r,int f){
if(L==l&&R==r)return (~f)?t[o].sum:t[o].mx;
int mid=L+R>>;
if(r<=mid)return query(L,mid,ls(o),l,r,f);
else if(l>mid) return query(mid+,R,rs(o),l,r,f);
else {
if(~f)return query(L,mid,ls(o),l,mid,f)+query(mid+,R,rs(o),mid+,r,f);
else return max(query(L,mid,ls(o),l,mid,f),query(mid+,R,rs(o),mid+,r,f));
}
}
const int inf=0x7fffffff;
long long Query(int u,int v,int f){
long long ret=(~f)?:-inf;
while(Top[u]!=Top[v]){
if(dep[Top[u]]<dep[Top[v]])swap(u,v);
if(~f)ret+=query(,n,,dfn[Top[u]],dfn[u],f);
else ret=max(ret,query(,n,,dfn[Top[u]],dfn[u],f));
u = fa[Top[u]];
}
if(dep[u]<dep[v])swap(u,v);
if(~f)ret+=query(,n,,dfn[v],dfn[u],f);
else ret=max(ret,query(,n,,dfn[v],dfn[u],f));
return ret;
}
char op[];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
scanf("%d",&n);
for(int i=;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
ins(u,v),ins(v,u);
}
for(int i=;i<=n;i++)scanf("%d",w+i);
dfs1(),dfs2(),build(,n,);
int q,u,v;scanf("%d",&q);
while(q--){
scanf("%s%d%d",op,&u,&v);
if(*op=='C')updata(,n,,dfn[u],v);
else printf("%lld\n",op[]=='S'?Query(u,v,):Query(u,v,-));
}
}
树剖模板by fcdalao的更多相关文章
- 【树链剖分】洛谷P3384树剖模板
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- 洛谷树剖模板题 P3384 | 树链剖分
原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...
- Aragorn's Story HDU - 3966 -树剖模板
HDU - 3966 思路 :树链剖分就是可以把一个路径上的点映射成几段连续的区间上.这样对于连续的区间可以用线段树维护, 对于每一段连续的区间都可以通过top [ ]数组很快的找到这段连续区间的头. ...
- 树剖模板(洛谷P3384 【模板】树链剖分)(树链剖分,树状数组,树的dfn序)
洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\su ...
- [NOI2015,LuoguP2146]软件包管理器------树剖
***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的 ...
- UVA1674 闪电的能量 树剖
UVA1674 闪电的能量 树剖 题面 水.树剖模板 #include <cstdio> #include <cstring> #include <algorithm&g ...
- 【61测试】【dp】【二分】【前缀和】【树剖】
不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...
- tarjan,树剖,倍增求lca
1.tarjan求lca 思想: void tarjan(int u,int f){ for(int i=---){//枚举边 if(v==f) continue; dfs(v); //继续搜 uni ...
- SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)
You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...
随机推荐
- ECSHOP和SHOPEX快递单号查询国际EMS插件V8.6专版
发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...
- connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)
nginx + php做服务,在高并发的时候会出现一些错误 connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporar ...
- CSS 转载
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...
- 05 redis(进阶)
redis 阶段一.认识redis 1.什么是redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remo ...
- dot安装和使用
1.安装 apt-get install graphviz 如果报错说缺少依赖文件,则使用apt自动安装依赖项 apt-get -f install 我在安装中报错: dpkg: unrecovera ...
- JAVA 泛型之类型擦除
★ 泛型是 JDK 1.5 版本引进的概念,之前是没有泛型的概念的,但泛型代码能够很好地和之前版本的代码很好地兼容. CollectionTest.java ---编译成CollectionTest. ...
- C# 面试题 (一)
一.C# 理论 1.1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 private : 私有成员, 在类 ...
- Altera Stratix IV 命名规则
由于要开发基于DE4平台的应用,应该要了解一下该平台的芯片情况Stratix IV 具体型号为:Stratix IV EP4SGX230KF40C2 命名规范如下 官网资料为:https://www. ...
- 分支push不上去的问题
还原一下现场,我在自己的项目里面,从master里面checkout的一个分支,当我在我这个分支里面进行 push代码的操作,我突然发现我的代码不能执行push的操作,如图 这个原因是由于远端的仓库没 ...
- 集成activiti到现有项目中
1.在lib中添加相关的jar包 2.找到一个activiti.cfg.xml,若是想用现有的数据库需要配置 <?xml version="1.0" encoding=&qu ...