树剖模板题啊!

这道题的话,最通(jian)俗(dan)易(cu)懂(bao)的解法应该就是树剖了。

加上线段树维护树上路径的最大权值(\(Max\))和路径和(\(sum\))。

至于\(LCT\)这种高级操作对于我这种新手还是比较困难的\(qwq\)

以下是参考代码:(有什么问题欢迎指教!)

#include<cstdio>
const int MAXN=30010;
inline int max(int a,int b){return a>b?a:b;}
inline int read(){
int s=0;bool f=false;char c=getchar();
while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
return (f)?(-s):(s);
}
int n,m,summ,maxx;
int seg[MAXN],rev[MAXN],top[MAXN];
int dep[MAXN],siz[MAXN],son[MAXN],father[MAXN];
int tot,ver[MAXN<<1],fir[MAXN<<1],nxt[MAXN<<1];
inline void Add_edge(int u,int v){
nxt[++tot]=fir[u],fir[u]=tot,ver[tot]=v;
nxt[++tot]=fir[v],fir[v]=tot,ver[tot]=u;
}
int val[MAXN],sum[MAXN<<2],Max[MAXN<<2];
inline int lc(int rt){return rt<<1;}
inline int rc(int rt){return rt<<1|1;}
inline void push_sum(int rt){
sum[rt]=sum[lc(rt)]+sum[rc(rt)];
}
inline void push_max(int rt){
Max[rt]=max(Max[lc(rt)],Max[rc(rt)]);
}
inline void build(int rt,int l,int r){
if(l==r)
sum[rt]=Max[rt]=val[rev[l]];
else{
int mid=(l+r)>>1;
build(lc(rt),l,mid);
build(rc(rt),mid+1,r);
push_sum(rt),push_max(rt);
}
}
inline void update(int rt,int l,int r,int id,int v){
if(id<l||id>r) return;
if(l==r&&l==id)
sum[rt]=Max[rt]=v;
else{
int mid=(l+r)>>1;
update(lc(rt),l,mid,id,v);
update(rc(rt),mid+1,r,id,v);
push_sum(rt),push_max(rt);
}
}
inline void query(int rt,int l,int r,int x,int y){
if(r<x||l>y) return;
if(x<=l&&r<=y)
summ+=sum[rt],maxx=max(maxx,Max[rt]);
else{
int mid=(l+r)>>1;
query(lc(rt),l,mid,x,y);
query(rc(rt),mid+1,r,x,y);
}
}
inline void dfs1(int u,int f){
dep[u]=dep[f]+1,siz[u]=1,father[u]=f;
for(int v,i=fir[u];i;i=nxt[i])
if((v=ver[i])!=f){
dfs1(v,u),siz[u]+=siz[v];
if(siz[son[u]]<siz[v])son[u]=v;
}
}
inline void dfs2(int u,int topf){
top[rev[seg[u]=++seg[0]]=u]=topf;
if(!son[u])return;else dfs2(son[u],topf);
for(int v,i=fir[u];i;i=nxt[i])
if(!top[v=ver[i]])dfs2(v,v);
}
inline void ask(int x,int y){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]>=dep[fy]){
query(1,1,n,seg[fx],seg[x]);
x=father[fx],fx=top[x];
}
else{
query(1,1,n,seg[fy],seg[y]);
y=father[fy],fy=top[y];
}
}
if(dep[x]<=dep[y])
query(1,1,n,seg[x],seg[y]);
else
query(1,1,n,seg[y],seg[x]);
}
int main(){
n=read();
for(int i=1;i<n;++i)
Add_edge(read(),read());
for(int i=1;i<=n;++i)
val[i]=read();
dfs1(1,0),dfs2(1,1),build(1,1,n);
m=read();
char opt[10];
while(m--){
scanf("%s",opt);
int x=read(),y=read();
if(opt[0]=='C')
update(1,1,n,seg[x],y);
else{
summ=0;
maxx=-10000000;
ask(x,y);
if(opt[1]=='M')
printf("%d\n",maxx);
else
printf("%d\n",summ);
}
}
return 0;
}

「ZJOI2008」树的统计的更多相关文章

  1. 【一本通提高树链剖分】「ZJOI2008」树的统计

    [ZJOI2008]树的统计 题目描述 一棵树上有 n n n 个节点,编号分别为 1 1 1 到 n n n,每个节点都有一个权值 w w w. 我们将以下面的形式来要求你对这棵树完成一些操作: I ...

  2. 「ZJOI2008」「LuoguP2590」树的统计(树链剖分

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...

  3. 「NOI2013」树的计数 解题报告

    「NOI2013」树的计数 这什么神题 考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序 设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\) 一个暴力 ...

  4. 「SDOI2017」树点涂色 解题报告

    「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...

  5. 「ZJOI2017」树状数组(二维线段树)

    「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...

  6. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  7. loj#2665. 「NOI2013」树的计数

    目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...

  8. 「模板」 树链剖分 HLD

    「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #incl ...

  9. 「JLOI2012」树

    「JLOI2012」树 传送门 不得不说这题的数据是真的水... 我们可以想到很明确的一条思路:枚举每一个点向根节点跳,知道路径和不小于 \(s\),恰好等于 \(s\) 就直接加答案. 跳的过程可以 ...

随机推荐

  1. JSON解析及数据库操作实战篇

    代码: JSONObject json = JSONObject.parseObject(ubody);//得到整个json JSONObject AutoTable=json.getJSONObje ...

  2. web前端基础-css-尺寸边框

    尺寸和边框: 一.尺寸 行内元素是不能设置宽和高的,其高度是由元素里面的内容的高度撑起来的: 行内块元素可以设置宽和高,当行内块元素没有设置宽高的时候,行内块元素的宽高是其默认的宽高: 块级元素:可以 ...

  3. AcWing 793. 高精度乘法

    https://www.acwing.com/problem/content/795/ #include<bits/stdc++.h> using namespace std; //A*b ...

  4. 转载:EQ

    https://blog.csdn.net/qiumingjian/article/details/46326269 https://blog.csdn.net/sszhouplus/article/ ...

  5. HTML学习(16)颜色

    HTML 颜色由红色.绿色.蓝色混合而成. 颜色值 HTML 颜色由一个十六进制符号来定义,这个符号由红色.绿色和蓝色的值组成(RGB). 每种颜色的最小值是0(十六进制:#00).最大值是255(十 ...

  6. MODULE BUILD FAILED: ERROR: COULDN’T FIND PRESET “ES2015” RELATIVE TO DIRECTORY

    npm run dev 遇到报错: Module build failed: Error: Couldn't find preset "es2015" relative to di ...

  7. 【做题笔记】[NOIOJ,非NOIp原题]装箱问题

    题意:给定一些矩形,面积分别是 \(1\times 1,2\times 2,3\times 3,4\times 4,5\times 5,6\times 6\).您现在知道了这些矩形的个数 \(a,b, ...

  8. ubuntu 下的ftp详细配置

    FTP(文件传输协议)是一个较老且最常用的标准网络协议,用于在两台计算机之间通过网络上传/下载文件.然而, FTP 最初的时候并不安全,因为它仅通过用户凭证(用户名和密码)传输数据,没有进行加密. 警 ...

  9. 「题解」「UOJ-164」「清华集训2015」V

    目录 题目 原题目 简要题目 正解 这道题题目简洁新颖,吸引读者阅读兴趣... 题目 原题目 点这里 简要题目 需要你维护长度为n的序列并支持下列操作: 区间加法: 区间赋值: 区间每个 \(a_i\ ...

  10. sublime-text3 安装 emmet 插件

    下载sublime,http://www.sublimetext.com/ 安装package control :https://packagecontrol.io/ins... 这个地址需要翻墙,访 ...