树剖模板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 ...
随机推荐
- Redis面试问题
下面列出的这些其中有一些是我面试时遇到的,但是当时自己还不会,所以在网站上找了以下,然后整理出来,加强记忆 感谢码洞将这些问题整理出来: Redis有哪些数据结构? 字符串String.字典Hash. ...
- MongoDB学习(1)--安装,基本curd操作
知识点: 1-MongoDB 安装,启动和卸载 2-基本概念 3-基本的增删改查操作(CURD) 来回顾总结一把学习的mongodb,如果有javascript基础,学习"芒果DB" ...
- sqlite3 简单实用方法
打开数据库:sqlite3.exe test.db 显示所有表: .tables 退出 sqlite3:.quit 还有个问题,已经打开一个数据库文件了. 不知道如何在不退出命令行的情况下,更换另一个 ...
- 学习python第一天 pycharm设置
print(“hello,world”) pycharm设置 1. 选择python 解析器,目的是确定pycharm 的运行环境. 方法: File-->Settings-->Proje ...
- Vue 服务器端渲染(一)
什么是服务器端渲染(SSR)? Vue.js 是构建客户端应用程序的框架.默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM.然而,也可以将同一个组件渲染为服务器端的 HT ...
- Flask初见
Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSIG工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. Flask也被称为 “m ...
- Leecode刷题之旅-C语言/python-53.最大子序和
/* * @lc app=leetcode.cn id=53 lang=c * * [53] 最大子序和 * * https://leetcode-cn.com/problems/maximum-su ...
- Python3 使用基本循环实现多级目录(思路)
一.多级目录设计: 1. 通过循环的方式显示菜单和进入菜单 2. 设置标志位以提供回退上一层菜单 2. 设置标志位以提供退出程序 二.注意要点: 1. 菜单样式,层次关系不要弄混乱 2. 当输入错误时 ...
- .Net 面试题 汇总(一)
1.@page指令只能在_aspx___文件(填写扩展名)中使用,而@Control指令只能用在_ascx___文件(填写扩展名)中使用. 2.说明控件DataGrid,DataTable,DataV ...
- 编译net core时nuget里全部报错,\obj\project.assets.json找不到
除了Nuget管理设置允许下载缺少的程序包 如果你自己设置的程序包源里有一个源访问不到,则可能出现下面错误,导致所有nuget无法还原. 而且在VS2017里不会出现这个 SDK,特别是你网上下载的其 ...