「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\) 就直接加答案. 跳的过程可以 ...
随机推荐
- C#常见几种集合比较
1. ArrayList 1.1 ArrayList是一个特殊数组,通过添加和删除元素就可以动态改变数组的长度. ArrayList集合相对于数组的优点:支持自动改变大小,可以灵活的插入元素,可以灵活 ...
- IF EXISTS 两个条件连用
当IF EXISTS要判断多个条件并存时,可以用AND连接,NOT EXISTS同理 IF EXISTS (SELECT 1 ) AND EXISTS (SELECT 2 ) BEGIN ...... ...
- python之路之课后作业
以下代码只包含管理员代码,用户代码和管理员相似 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os sys.path. ...
- mybatis(六):设计模式 - 责任链模式
- PLSQL Developer12注册码
product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number:226959 password: xs374ca 绝对靠谱
- ❀❀ 名词解释(PM、PD、UE、UI、RD....)
PM:产品经理,项目负责人.一个产品,首先由PM来分析细分市场.目标客户的诉求,规划产品的卖点.杀手级应用,这个过程通常PD已经介入了,这个层面上,商业问题.业务逻辑的流畅是思考的焦点. 举凡产品从创 ...
- get_class和get_called_class的区别
get_class () 获取当前调用方法的类名get_called_class() 获取静态绑定后的类名 class Foo{ public function test() { v ...
- 【做题笔记】洛谷P1464 Function
我先谔谔一波 /kk 我谔谔 看题第一眼:欸这不就是按题意递归嘛,,直接搞不就好了 3 min 后,重新看题 然后自己手玩了几个样例,噢,递归太多了,铁定会 T 啊...... 然后,作为一个从没写过 ...
- 启动docker报Failed to start Docker Application Container Engine.解决
[root@docker ~]# systemctl status docker.service● docker.service - Docker Application Container Engi ...
- 浅谈DAO工厂设计模式(工厂模式的好处)
随着软件分层设计的流行及广泛的应用,对于DAO的设计模式大家已经不再陌生了,DAO层已经在软件系统的开发中成为必不可少的一层,将后台的数据层和前台的VO进行分离.前段时间也针对于DAO的设计介绍过一个 ...