树剖模板题啊!

这道题的话,最通(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. element 表格里的input点击回车聚焦下个input

    <template> <card> <el-table ref="singleTable" :data="tableData" h ...

  2. Spring MVC 中使用properties文件

    首先要搭建Spring mvc的环境,然后开始properties文件里的配置: 第一步:在springcontext中注入properties,具体路径自己调整 <bean id=" ...

  3. Java 浮点数精度控制

    1.String.format​(String format,Object… args) Java中用String.format()来控制输出精度, format参数用来设置精度格式, args参数代 ...

  4. CentOS 7下用firewall-cmd控制端口与端口转发

    # 将80端口的流量转发至192.168.0.1的8080端口 1.firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toad ...

  5. centos 7 安装 nginx maxmind GEO IP IP库相关部署

    centos 7 上为nginx 增加Geo IP的功能 yum install gcc gcc-c++ make automake autoconf libtool wget unzip -y if ...

  6. linux php 扩展安装

    phpize./configure --with-php-config=/usr/bin/php-config make && make install

  7. Wx-小程序-使用canvas截图保存

    1. wxml 页面 使用画布来站位,并给按钮添加绑定事件 <button class='btn btn-theme' bindtap='setSaveImage'>保存图片到本地< ...

  8. C#常用的form窗体属性(最大化、最小化、窗体居中)

    一.窗体居中 //窗体居中 this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 二.去掉最小化.最大化 ...

  9. 基于icmp的tracert路由追踪程序

    https://blog.csdn.net/u013271921/article/details/45488173 #include<winsock2.h> //#include<i ...

  10. 1.BMap(百度地图)第二次加载显示不全

    问题: bmap第一次加载显示没问题: 第二次 再次加载这个页面时,地图的显示出现了问题: . 分析问题出现原因:你要确保dom创建后且处于显示状态(即display不能为none)才能再次初始化地图 ...