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. html鼠标事件

    jsp鼠标事件汇总 onclick 单击时触发的事件,这个比较常用 ondblclick 双击时触发的事件 onmoucedown 鼠标按下时触发的事件(个人觉得与onclick异曲同工) onmou ...

  2. hihocoder1699

    链接:http://hihocoder.com/problemset/problem/1699 快毕业了的菜菜,做了个比赛,遇到四维偏序,调成了傻逼,所以记录下,看了下以前的傻逼代码,发现自己的cdq ...

  3. 【BZOJ 4353】 Play with tree

    [题目链接] 点击打开链接 [算法] 树链剖分 对于线段树的每个节点,记录这段区间的最小值,最小值的个数,值为0的个数,此外,还要维护两个懒惰标记 [代码] 本题细节很多,写程序时要认真严谨! #in ...

  4. Could not find modernizr-2.6.2 in any of the sources

  5. P2470 [SCOI2007]压缩

    传送门 区间dp,记\(dp(l,r,t)\)表示区间\((l,r)\),\(t\)表示这个区间中能不能放\(M\).如果可以,枚举中间哪里放\(M\)来压缩.也可以不压缩,后面直接跟上去.如果左右重 ...

  6. magento Grid 显示下拉菜单属性

    在使用grid时自己新建了几个属性,然后其中有一个是下拉单,即deal_status protected function _prepareCollection() { $collection = M ...

  7. 生成清除某个数据库下的所有表的SQL语句

    方法1:重建库和表 用mysqldump --no-data把建表SQL导出来,然后drop database再create database,执行一下导出的SQL文件: 方法2:生成清空所有表的SQ ...

  8. c# 线程浅析(代理 、Invoke、Lock)

    前言:本来想根据自己的经验总结一下c#线程相关的知识点, 写之前看了一些其他人的博客,发现自己也就掌握了不到三分之一....希望通过这次的博客将自己的知识点补充一下,写出更直白的博客和初学者分享. 这 ...

  9. Android基础TOP7_1:ListView制作列表

    结构: Activity: activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/r ...

  10. 百度人脸识别AI实践.doc

    0, 前言 百度开放了很多AI能力,其中人脸识别就是其中之一. 本文对百度人脸识别AI进行实践检验,看看其使用效果如何. 鉴于是最为基础的实践,基本都是在其接口范例代码修改而来. 百度人脸识别AI网站 ...