「ZJOI2008」树的统计
树剖模板题啊!
这道题的话,最通(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」树的统计的更多相关文章
- 【一本通提高树链剖分】「ZJOI2008」树的统计
[ZJOI2008]树的统计 题目描述 一棵树上有 n n n 个节点,编号分别为 1 1 1 到 n n n,每个节点都有一个权值 w w w. 我们将以下面的形式来要求你对这棵树完成一些操作: I ...
- 「ZJOI2008」「LuoguP2590」树的统计(树链剖分
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 「NOI2013」树的计数 解题报告
「NOI2013」树的计数 这什么神题 考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序 设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\) 一个暴力 ...
- 「SDOI2017」树点涂色 解题报告
「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...
- 「ZJOI2017」树状数组(二维线段树)
「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...
- 「HNOI2016」树 解题报告
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...
- loj#2665. 「NOI2013」树的计数
目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...
- 「模板」 树链剖分 HLD
「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #incl ...
- 「JLOI2012」树
「JLOI2012」树 传送门 不得不说这题的数据是真的水... 我们可以想到很明确的一条思路:枚举每一个点向根节点跳,知道路径和不小于 \(s\),恰好等于 \(s\) 就直接加答案. 跳的过程可以 ...
随机推荐
- 第二篇,前端高性能JavaScript优化
加载和执行 JavaScript是单线程,所以JavaScript的加载和执行是从上下文加载执行完一个继续加载执行下一个文件会阻塞页面资源的加载,所以一般情况下JavaScript文件放在body标签 ...
- python之路之模块
subprocess模块 复杂命令 logging模块(重点) 日志模块,线程安全
- 开发笔记—钉钉服务商应用isv开发,从应用配置,到获取客户企业通讯录
以第三方企业微应用为例 在第三方企业微应用应用时,比较底层的需求,就是应用需要获取客户企业的通讯录,即部门/员工的数据.本人整理以下几个关键数据,供大家开发参考. 新建第三方微应用时,能拿到这些初始数 ...
- 怎么把html页面部署到云服务器上
1,下载nginx 2,把页面放置到云服务器上 3,通过配置nginx conf下的nginx.conf文件,就可以通过ip:port访问到了 链接:https://www.cnblogs.com/f ...
- Python 多任务(线程) day2 (2)
同步 1.概念 :同步就是协同步调,按预定的先后次序运行 互斥锁 当多个线程几乎同时修改某一共享数据的时候,需要运行同步控制,最简单的同步机制是引入互斥锁.某个线程要更改共享数据时,先将其锁定,此时资 ...
- 每天进步一点点------ISE 12.4的FPGA设计基本流程
基于ISE 12.4的FPGA设计基本流程 ISE是使用XILINX的FPGA的必备的设计工具,它可以完成FPGA开发的全部流程,包括设计输入.仿真.综合.布局布线.生成BIT文件.配置以及在线调试等 ...
- Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览
一.设计原理 1.Hadoop架构: 流水线(PipeLine) 2.Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS 3.Hadoop架构: 关于Recovery (Lease ...
- FreeRTOS学习笔记1:任务
任务特性每个任务有自己的环境,不依赖于其他任务与调度器任何时间点只有一个任务运行.由调度器决定上下文环境:(寄存器值.堆栈内容等)调度器保证的就是任务开始执行时的上下文环境与上一次退出时相同所以每个任 ...
- CDH仅完成 0/3 个步骤。首个失败:主机 node6 (id=2) 上的客户端配置 (id=1) 已使用 1 退出,而预期值为 0。
CDH仅完成 0/3 个步骤.首个失败:主机 node6 (id=2) 上的客户端配置 (id=1) 已使用 1 退出,而预期值为 0 javaHome出现了问题 JAVA_HOME并不是根据环境 ...
- 2.5 【配置环境】多浏览器驱动 (chrome、IE、Firefox)❀
来源:http://blog.csdn.net/huilan_same/article/details/51896672 http://www.cnblogs.com/thinkCoding/p/64 ...