洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)
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]树的统计(树链剖分模板练手)的更多相关文章
- 洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]: ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- [洛谷P2590][ZJOI2008]树的统计
题目大意:一棵树,支持三个操作, $CHANGE\;u\;t:$ 把结点$u$的权值改为$t$ $QMAX\;u\;v:$ 询问从点$u$到点$v$的路径上的节点的最大权值 $QSUM\;u\;v:$ ...
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)
题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...
- 洛谷 P2590 [ZJOI2008]树的统计(树链剖分)
题目描述一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- 洛谷 P2590 [ZJOI2008]树的统计
大家好,我非常喜欢暴力数据结构,于是我用块状树过了这道题目 题目: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE ...
- 洛谷——P2590 [ZJOI2008]树的统计
https://www.luogu.org/problem/show?pid=2590#sub 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这 ...
随机推荐
- linux下库的使用
1 指定使用了什么库 -lstdc++ 这样链接的时候就会去指定的目录下找链接库,优先使用动态库.然后在elf文件中加入依赖关系,放在NEEDED中. 2 指定在哪里去找库 -Wl,-rpath,so ...
- vue iview Select bug,在低版本浏览器中报错
iview是个好东西,今天第一次试用,用来做了一个app,但是在安卓5.1各种报错啊,头痛的是不知道具体哪行代码错了,总是报错undefined is not a function. 倒腾了半天,原来 ...
- Bootstrap popover源码分析
/* ======================================================================== * Bootstrap: popover.js ...
- [译]NUnit--Installation(三)
Installation NUnit安装程序默认安装文件路径为C:\Program Files\NUnit 2.6.2.根据用户选择安装的选项,安装文件有三个子文件夹:bin.doc.samples. ...
- 理解javascript中的事件模型
javascript中有两种事件模型:DOM0,DOM2.而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些. 一. DOM0级事件模型 DOM0级事件模型是早期的事件 ...
- AutoCAD VBA添加菜单
# 给cad添加自定义菜单 Private Sub AddBar() Dim NewMenuItem As AcadPopupMenuItem Dim TheMacro As String Dim M ...
- 第四代增强 源代码增强(ABAP Source Code Enhancements)
显式代码增强的创建 se38打开你要增强的程序 进入编辑状态 在菜单栏选择: Edit->Enhancement Opreations->Create option. 此时弹出Create ...
- spring data elasticsearch的 @Documnet 和 @Field 注解
@Documnet 注解 public @interface Document { String indexName(); //索引库的名称,个人建议以项目的名称命名 String type() de ...
- HTML基础2——综合案例3——创建考试报名表格
<html> <head> <title></title> </head> <body> <table width=&qu ...
- maxItemsInObjectGraph解释
maxItemsInObjectGraph:一个整数,指定要序列化或反序列化的最大项数,可以限制对象图中要序列化的项数.默认的就是65535,当客户端与WebService之间传递的是对象要序列化的个 ...