树剖模板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 ...
随机推荐
- (数据科学学习手札04)Python与R在自定义函数上的异同
自编函数是几乎每一种编程语言的基础功能,有些时候我们需要解决的问题可能没有完全一致的包中的函数来进行解决,这个时候自编函数就成了一样利器,而Python与R在这方面也有着一定的差别,下面举例说明: P ...
- POJ-2421-Constructing Roads(最小生成树 普利姆)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26694 Accepted: 11720 Description The ...
- python2.7入门---正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.re 模块使 Pytho ...
- 扩展报表-JavaSet
前言 使用商业分析中的扩展报表平台,可以很方便的进行数据分析,进行图表化直观展示.一般情况下使用SQL数据集进行SQL的编写,进而配合扩展报表平台进行数据分析图表的绘制,但SQL数据集针对固定的参数进 ...
- 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- iOS中的数据库应用
iOS中的数据库应用 SLQLite简介 什么是SQLite SQLite是一款轻型的嵌入式数据库 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 它的处理速度比Mysql.Post ...
- ACE_Select_Reactor_T 介绍 (2)
本章目录 ACE_Select_Reactor_T 介绍 类继承图 类协作图 类主要成员变量 事件处理函数调用图 事件处理主流程 handle_events 函数流程 handle_events_i ...
- zabbix 2.2 调小监控值
zabbix_agent默认disk下小于0%告警 调小到5% 组态 > 模板 选择需要的模板的触发器 例如 Template OS Windows 选择触发器 - 探索规则 - 触发器类型 ...
- ubuntu安装显卡驱动和cuda
NVIDIA-linux.run安装后,会出现登录页面循环,解决办法是在运行命令后加入-no-opengl-files 打开nvidia x server Settings软件,显示:You do n ...
- LeetCode 29——两数相除
1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...