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. java多线程面试题(来自转载)

    在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问 ...

  2. 【转载】批量部署系统之kickstart

    一.安装各服务: ftp服务提供软件软件源,tftp提供引导文件,dhcp提供PXE文件位置,syslinux提供PXE文件 [root@node1~]# yum -y installtftp-ser ...

  3. bzoj 1731: [Usaco2005 dec]Layout 排队布局【差分约束】

    差分约束裸题,用了比较蠢的方法,先dfs_spfa判负环,再bfs_spfa跑最短路 注意到"奶牛排在队伍中的顺序和它们的编号是相同的",所以\( d_i-d_{i-1}>= ...

  4. Ubuntu服务器WDCP可视化界面搭建注意

    title: Ubuntu服务器WDCP可视化界面搭建注意 前两天心血来潮,研究了下服务器搭建与部署. 领了个免费体验3天的vps服务器进行了实操. 在安装WDCP的时候遇到了些问题,网上大部分对问题 ...

  5. Spring中bean的作用域与生命周期

    在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...

  6. ACM_拼接数字

    拼接数字 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个正整数数组,现在把数组所有数字都拼接成一个大数字,如何使得拼接后 ...

  7. vue+elementUI table篇

    1.table内容展示 <el-table stripe :key='tableKey' header-cell-class-name="bindonce" :data=&q ...

  8. 一行python能做什么!

    主要收集了平常遇到的代码和网上的简单题目,然后尝试将代码压缩到一行,仅仅是娱乐一下~~~ −−−−−(1)−−−−−−−−−−−(1)−−−−−− 用一行python写出一个嵌套的字符串. def p ...

  9. 全面学习ORACLE Scheduler特性(9)创建Chains

    五.使用Chains 今天要来认识一位新同学:CHAIN(注意不要敲成CHINA).CHAIN可以被视做一组Programs的复合,举个简单的例子:运行PROGRAM:A以及PROGRAM:B,如果成 ...

  10. java项目怎么打jar包(项目中包含第三方jar包)

    1,右键选中项目,点击Export导出,找到java,选择第三个Runnable JAR file, 2,在Launch configuration中,填入程序的入口(有main方法的类),   然后 ...