P2590 [ZJOI2008]树的统计(树链剖分)
虽然是入门树剖模板
但是我终于1A了(大哭)
懒得写啥了(逃
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int Max(int a,int b){return a>b?a:b;}
inline void Swap(int &a,int &b){a^=b^=a^=b;}
#define N 30005
int n,Q,Top[N],bgs[N],siz[N],fa[N],val[N];
int ID,id[N],tmp[N],sum[N<<],mxd[N<<];
int cnt,hd[N],nxt[N<<],ed[N],poi[N<<];
#define lc o<<1
#define rc o<<1|1
#define mid (l+r)/2
inline void adde(int x,int y){
nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y;
}
inline void up(int o){
sum[o]=sum[lc]+sum[rc];
mxd[o]=Max(mxd[lc],mxd[rc]);
}
void build(int o,int l,int r){
if(l==r){sum[o]=mxd[o]=tmp[l]; return ;}
build(lc,l,mid); build(rc,mid+,r); up(o);
}
void modi(int o,int l,int r,int x,int v){
if(l==r){sum[o]=mxd[o]=v; return ;}
if(x<=mid) modi(lc,l,mid,x,v);
else modi(rc,mid+,r,x,v);
up(o);
}
int ask1(int o,int l,int r,int x1,int x2){
if(x1<=l&&r<=x2) return mxd[o];
int re=-1e9;
if(x1<=mid) re=Max(re,ask1(lc,l,mid,x1,x2));
if(x2>mid) re=Max(re,ask1(rc,mid+,r,x1,x2));
return re;
}
int ask2(int o,int l,int r,int x1,int x2){
if(x1<=l&&r<=x2) return sum[o];
int re=;
if(x1<=mid) re+=ask2(lc,l,mid,x1,x2);
if(x2>mid) re+=ask2(rc,mid+,r,x1,x2);
return re;
}
void dfs1(int x,int Fa){
fa[x]=Fa; siz[x]=;
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==Fa) continue;
dfs1(to,x);
if(siz[to]>siz[bgs[x]]) bgs[x]=to;
siz[x]+=siz[to];
}
}
void dfs2(int x,int tp){
tmp[id[x]=++ID]=val[x]; Top[x]=tp;
if(bgs[x]) dfs2(bgs[x],tp);
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==fa[x]||to==bgs[x]) continue;
dfs2(to,to);
}
}
int Amax(int x,int y){
int re=-1e9;
for(;Top[x]!=Top[y];x=fa[Top[x]]){
if(id[Top[x]]<id[Top[y]]) Swap(x,y);
re=Max(re,ask1(,,n,id[Top[x]],id[x]));
}if(id[x]>id[y]) Swap(x,y);
return Max(re,ask1(,,n,id[x],id[y]));
}
int Asum(int x,int y){
int re=;
for(;Top[x]!=Top[y];x=fa[Top[x]]){
if(id[Top[x]]<id[Top[y]]) Swap(x,y);
re+=ask2(,,n,id[Top[x]],id[x]);
}if(id[x]>id[y]) Swap(x,y);
return re+ask2(,,n,id[x],id[y]);
}
int main(){
scanf("%d",&n); int q1,q2; char opt[];
for(int i=;i<n;++i)
scanf("%d%d",&q1,&q2),adde(q1,q2),adde(q2,q1);
for(int i=;i<=n;++i) scanf("%d",&val[i]);
dfs1(,); dfs2(,);build(,,n);
scanf("%d",&Q);
while(Q--){
scanf("%s%d%d",opt,&q1,&q2);
if(opt[]=='H') modi(,,n,id[q1],q2);
else if(opt[]=='M') printf("%d\n",Amax(q1,q2));
else if(opt[]=='S') printf("%d\n",Asum(q1,q2));
}return ;
}
P2590 [ZJOI2008]树的统计(树链剖分)的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- luoguP2590 [ZJOI2008]树的统计(树链剖分)
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
- BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- [ZJOI2008]树的统计——树链剖分
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
随机推荐
- centos7 下 apache nginx squid https正向代理 代理服务器
apache yum install httpd mod_ssl -y vim /etc/httpd/conf.d/ssl.conf Listen https <VirtualHost *:&g ...
- Kotlin Linux下的环境搭建
Kotlin是JVM世界里的未来主宰,不管你信不信,我反正相信了! 好吧,如果你不糊涂,就跟着我一起学学吧,哈哈 一下载https://github.com/JetBrains/kotlin/rele ...
- React对比Vue(一些小细节的差异)
@1===>发现一个神奇的地方在对数组进行增加删除的时候 react中一个输入框点击enter键,然后数组push,然后渲染 <input ref='valInput' onKeyUp={ ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- LeetCode108.将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- c# 修改xml格式config文件
xml 格式的config文件如下: <?xml version="1.0" encoding="utf-8"?> <configuratio ...
- 【Spring学习笔记-MVC】Spring MVC之多文件上传 (zhan)
http://www.cnblogs.com/ssslinppp/p/4607330.html (zhan)
- 关于oracle中的数字类型
1.关于number类型. 以下是从其文档中摘录出的一句话: p is the precision, or the total number of significant decimal digits ...
- memory consistency
目前的计算机系统中,都是shared memory结构,提供统一的控制接口给软件, shared memory结构中,为了memory correctness,可以将问题分为:memory consi ...
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...