树剖模板题啊!

这道题的话,最通(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. 并查集-F - How Many Tables

    F - How Many Tables 并查集的模板都能直接套,太简单不注释了,就存个代码 #include<bits/stdc++.h> using namespace std; ; i ...

  2. C语言数据结构——第四章 串

    四.串 4.1-串的基本概念 串的定义 串是由数字.字母或其他字符组成的有限序列,一般记为 StringName = “a[0]a[1]a[2]···a[i]···a[n-1]”(n>0,0&l ...

  3. 管理QT的组件

    1.在qt的安装目录找到'%QTROOT%\MaintenanceTool.exe'. 2.点击MaintenanceTool的设置,可以设置默认储存库.临时储存库.用户定义储存库,选择其中的临时储存 ...

  4. umi ui 构建时出现 spawn sh ENOENT 报错的解决方法

    在使用umi可视化界面构建项目的时候,如果出现spawn sh ENOENT错误,一般都是由于环境变量里没有设置git的环境变量导致的.在环境变量的path里加上"C:\Program Fi ...

  5. 解决无法将“babel”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    错误截图: 第一反应想到的是环境变量没有配置好,再仔细检查一下,并没有错误 在cmd窗口运行命令“ babel --version ”,如果出现对应的版本号,那就说明环境变量是正确的 解决方案: 用管 ...

  6. Mysql5.6基础命令

    Centos7下mysql5.6数据库的操作 Mysql如何修改密码? 1.使用mysqladmin修改,这种修改方式需要知道mysql的原始密码 修改密码后我们测试下看看能不能登录成功 怎么才能不需 ...

  7. Explainable ML

    定义: 不仅可以(分类),还要输出分类的理由是什么(局部),以及某一个分类的判断标准(全局) 局部: silence map. 把{x1.....xn}中每一个像素加一个偏移量之后,得到的y偏移量与x ...

  8. HTML5-语义化

    什么是语义化?就是用合理.正确的标签来展示内容,比如h1~h6定义标题. 语义化优点: 易于用户阅读,样式丢失的时候能让页面呈现清晰的结构. 有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权 ...

  9. 7.log4j

    Log4j:日志工厂的一部分(使用起来比较麻烦) 1.要想使用外部类,得先导包 pom.xml <dependency> <groupId>log4j</groupId& ...

  10. 爬虫入门 beautifulsoup库(一)

    先贴一个beautifulsoup的官方文档,https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id12 requ ...