P2590 [ZJOI2008]树的统计

I. CHANGE u t : 把结点u的权值改为t

II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值

III. QSUM u v: 询问从点u到点v的路径上的节点的权值和

(博主)神蒟本蒻,又A了一道树链剖分的模板题,还是太颓废了。。。

调了我一个小时。。。

dfs+线段树维护区间和和最大值。

自带大常常数

#include<iostream>
#include<cstdio>
#include<cmath> #define LL long long
#define IL inline
#define RE register
#define N 1000000
using namespace std; int head[N],tot,n,m,val[N],val_w[N];
struct node{
int to,next;
}e[N]; void add(int u,int v){
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
} int f[N],siz[N],son[N],top[N],dep[N],id[N],item; IL void dfs1(int u,int fa){
f[u]=fa,siz[u]=,dep[u]=dep[fa]+;
int maxson=-;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>maxson) maxson=siz[v],son[u]=v;
}
} IL void dfs2(int u,int topf){
id[u]=++item,top[u]=topf,val_w[item]=val[u];
if(!son[u]) return;
dfs2(son[u],topf);
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==f[u]||v==son[u]) continue;
dfs2(v,v);
}
}
struct Segment{
int l,r,w,w_max;
}tr[N]; IL void push_up(int k){
tr[k].w_max=max(tr[k<<].w_max,tr[k<<|].w_max);
tr[k].w=tr[k<<].w+tr[k<<|].w;
} IL void build(int k,int l,int r){
tr[k].l=l,tr[k].r=r;
if(l==r){tr[k].w=tr[k].w_max=val_w[l];return;}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
push_up(k);
} IL void change(int k,int X,int val_V){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l==r) {tr[k].w_max=tr[k].w=val_V;return;}
if(X<=mid) change(k<<,X,val_V);
else change(k<<|,X,val_V);
push_up(k);
} IL int ask_max(int k,int ql,int qr){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l>=ql&&r<=qr) return tr[k].w_max;
int ans=-0x7fffffff;
if(ql<=mid) ans=ask_max(k<<,ql,qr);
if(qr>mid) ans=max(ans,ask_max(k<<|,ql,qr));
return ans;
} IL int ask_sum(int k,int ql,int qr){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l>=ql&&r<=qr) return tr[k].w;
int ans=;
if(ql<=mid) ans+=ask_sum(k<<,ql,qr);
if(qr>mid) ans+=ask_sum(k<<|,ql,qr);
return ans;
} IL int q_max(int u,int v){
int ans=-0x7fffffff;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=max(ans,ask_max(,id[top[u]],id[u]));
u=f[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans=max(ans,ask_max(,id[v],id[u]));
return ans;
} IL int q_sum(int u,int v){
int ans=;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=ask_sum(,id[top[u]],id[u]);
u=f[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans+=ask_sum(,id[v],id[u]);
return ans;
} string s; int main()
{
scanf("%d",&n);
for(int u,v,i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i=;i<=n;i++) scanf("%d",&val[i]);
dfs1(,);
dfs2(,);
build(,,n);
scanf("%d",&m);
for(int u,v,i=;i<=m;i++){
cin>>s;
scanf("%d%d",&u,&v);
if(s=="CHANGE")
change(,id[u],v);
else if(s=="QMAX") printf("%d\n",q_max(u,v));
else printf("%d\n",q_sum(u,v));
} return ;
}

洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)的更多相关文章

  1. 洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]: ...

  2. 树的统计Count---树链剖分

    NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...

  3. 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]

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

  4. [洛谷P2590][ZJOI2008]树的统计

    题目大意:一棵树,支持三个操作, $CHANGE\;u\;t:$ 把结点$u$的权值改为$t$ $QMAX\;u\;v:$ 询问从点$u$到点$v$的路径上的节点的最大权值 $QSUM\;u\;v:$ ...

  5. BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 23015  Solved: 9336[Submit ...

  6. 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)

    题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...

  7. 洛谷 P2590 [ZJOI2008]树的统计(树链剖分)

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

  8. 洛谷 P2590 [ZJOI2008]树的统计

    大家好,我非常喜欢暴力数据结构,于是我用块状树过了这道题目 题目: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE ...

  9. 洛谷——P2590 [ZJOI2008]树的统计

    https://www.luogu.org/problem/show?pid=2590#sub 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这 ...

随机推荐

  1. Android6.0源码分析之录音功能(一)【转】

    本文转载自:http://blog.csdn.net/zrf1335348191/article/details/54949549 从现在开始一周时间研究录音,下周出来一个完整的博客,监督,激励!!! ...

  2. 7-80 HTML5新增的JS选择器

    7-80 HTML5新增的JS选择器 学习要点 HTML5新增的JS选择器 在传统的 JavaScript 开发中,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 ta ...

  3. 洛谷 P1573 栈的操作

    题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,-,n.每一个栈只支持一种操作:弹出并压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操 ...

  4. LA3704

    https://vjudge.net/problem/UVALive-3704 参考:http://www.cnblogs.com/iwtwiioi/p/3946211.html 循环矩阵... 我们 ...

  5. mybaties中,模糊查询的几种写法

    模糊查询: 工作中用到,写三种用法吧,第四种为大小写匹配查询 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('% ...

  6. 基于Flink的视频直播案例(下)

    目录 直播数字化运营 结果写入Elasticsearch 第二种思路 Flink实现总结 Elasticsearch部分 Kibana部分 直播数字化运营 业务目标 全站观看直播总人数以及走势 房间直 ...

  7. iPhone各尺寸 app界面设计尺寸规范

    ip6: 375 * 667 pt @2x   ~ 750 x 1334 ip6+: 414 * 736 pt @3x ~ 1242 x 2208 ip5: 320 * 568 pt  @2x ~ 6 ...

  8. bzoj 1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏【模拟】

    模拟 #include<iostream> #include<cstdio> using namespace std; int n,ans; int main() { scan ...

  9. [Swift]经典解题思路:联合查找Union Find

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. Invalid default value for 'create_date' timestamp field

    创建表的语句中有这么一句 `create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', 1 之后就报了这个错误. That is be ...