【ZJOI 2008】树的统计
【题目链接】
【算法】
树链剖分模板题
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 30000 struct SegmentTree {
int l,r,maxn,sum;
} tree[MAXN*]; int i,N,Q,u,v,t,num;
int size[MAXN+],fa[MAXN+],son[MAXN+],pos[MAXN+],
top[MAXN+],dep[MAXN+],id[MAXN+],a[MAXN+];
string opt;
vector<int> E[MAXN+]; template <typename T> inline void read(T &x) {
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * + c - '';
x *= f;
} template <typename T> inline void write(T x) {
if (x < ) { putchar('-'); x = -x; }
if (x > ) write(x/);
putchar(x%+'');
} template <typename T> inline void writeln(T x) {
write(x);
puts("");
} inline void dfs1(int x) {
int i,y;
size[x] = ; son[x] = ;
for (i = ; i < E[x].size(); i++) {
y = E[x][i];
if (y == fa[x]) continue;
dep[y] = dep[x] + ;
fa[y]= x;
dfs1(y);
size[x] += size[y];
if (size[y] > size[son[x]]) son[x] = y;
}
} inline void dfs2(int x,int tp) {
int i,y;
id[x] = ++num; top[x] = tp; pos[num] = x;
if (son[x]) dfs2(son[x],tp);
for (i = ; i < E[x].size(); i++) {
y = E[x][i];
if ((y != fa[x]) && (y != son[x]))
dfs2(y,y);
}
} inline void build(int index,int l,int r) {
int mid;
tree[index].l = l; tree[index].r = r;
if (l == r) {
tree[index].sum = tree[index].maxn = a[pos[l]];
return;
} else {
mid = (l + r) >> ;
build(index*,l,mid); build(index*+,mid+,r);
tree[index].sum = tree[index*].sum + tree[index*+].sum;
tree[index].maxn = max(tree[index*].maxn,tree[index*+].maxn);
}
} inline void modify(int index,int pos,int t) {
int mid;
if (tree[index].l == tree[index].r) {
tree[index].sum = tree[index].maxn = t;
} else {
mid = (tree[index].l + tree[index].r) >> ;
if (mid >= pos) modify(index*,pos,t);
else modify(index*+,pos,t);
tree[index].maxn = max(tree[index*].maxn,tree[index*+].maxn);
tree[index].sum = tree[index*].sum + tree[index*+].sum;
}
} inline int query_max(int index,int l,int r) {
int mid;
if ((tree[index].l == l) && (tree[index].r == r)) return tree[index].maxn;
else {
mid = (tree[index].l + tree[index].r) >> ;
if (mid >= r) return query_max(index*,l,r);
else if (mid + <= l) return query_max(index*+,l,r);
else return max(query_max(index*,l,mid),query_max(index*+,mid+,r));
}
} inline int query_sum(int index,int l,int r) {
int mid;
if ((tree[index].l == l) && (tree[index].r == r)) return tree[index].sum;
else {
mid = (tree[index].l + tree[index].r) >> ;
if (mid >= r) return query_sum(index*,l,r);
else if (mid + <= l) return query_sum(index*+,l,r);
else return query_sum(index*,l,mid) + query_sum(index*+,mid+,r);
}
} inline int query1(int u,int v) {
int tu = top[u],
tv = top[v],
ans = -2e9;
while (tu != tv) {
if (dep[tu] > dep[tv]) {
swap(u,v);
swap(tu,tv);
}
ans = max(ans,query_max(,id[tv],id[v]));
v = fa[tv]; tv = top[v];
}
if (id[u] > id[v]) swap(u,v);
ans = max(ans,query_max(,id[u],id[v]));
return ans;
} inline int query2(int u,int v) {
int tu = top[u],
tv = top[v],
ans = ;
while (tu != tv) {
if (dep[tu] > dep[tv]) {
swap(u,v);
swap(tu,tv);
}
ans += query_sum(,id[tv],id[v]);
v = fa[tv]; tv = top[v];
}
if (id[u] > id[v]) swap(u,v);
ans += query_sum(,id[u],id[v]);
return ans;
} int main() { read(N);
for (i = ; i < N; i++) {
read(u); read(v);
E[u].push_back(v);
E[v].push_back(u);
}
dfs1();
dfs2(,);
for (i = ; i <= N; i++) read(a[i]); build(,,num); read(Q); while (Q--) {
cin >> opt;
if (opt == "CHANGE") {
read(u); read(t);
modify(,id[u],t);
} else if (opt == "QMAX") {
read(u); read(v);
writeln(query1(u,v));
} else {
read(u); read(v);
writeln(query2(u,v));
}
} return ; }
【ZJOI 2008】树的统计的更多相关文章
- zjoi 2008 树的统计——树链剖分
比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...
- C++之路进阶——codevs2460(树的统计)
2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节 ...
- 2008ZJOI树的统计
codevs 2460 树的统计 http://codevs.cn/problem/2460/ 2008年省队选拔赛浙江 题目等级 : 大师 Master 题目描述 Description 一棵 ...
- Codevs 2460 == BZOJ 1036 树的统计
2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...
- BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14302 Solved: 5779[Submit ...
- bzoj1036 [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12646 Solved: 5085 [Subm ...
- BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 14354 Solved: 5802 [Subm ...
- 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分
[BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
随机推荐
- T3138 栈练习2 codevs
http://codevs.cn/problem/3138/ 题目描述 Description 给定一个栈(初始为空,元素类型为整数,且小于等于100),只有两个操作:入栈和出栈.先给出这些操作,请输 ...
- T2038 香甜的黄油 codevs
http://codevs.cn/problem/2038/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 农夫John ...
- Chrome常用URL命令(伪URL)
在Chrome地址栏输入chrome://chrome-urls/可以看到所有的Chrome支持的伪RUL 1.chrome://accessibility/ 可达性分析,默认是关闭的,点击acces ...
- ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗
1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而 ...
- 【Todo】【转载】Scala中Array, List, Tuple的区别
参考了这篇文章: https://my.oschina.net/u/1034176/blog/512314 1. 在Scala 2.7中,Array.List都不能混合类型,只有Tuple可以:而在S ...
- 关于 thinkPHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback 关于thinkPHP rpc调 ...
- 翻翻git之---"有趣效果"的自己定义View EasyArcLoading
转载请注明出处:王亟亟的大牛之路 早上写了一个关于MD的文章,下午给编译器调了个色,感觉要上天了.所以为了试颜色就出了这篇文章,让大家一起瞎一下 好了废话不说.这一片给大家介绍一个当做Dialog作用 ...
- 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用
一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection 2.获取statement 3.获取resultset 4 ...
- Yii框架中安装srbac扩展方法
首先,下载srbac_1.3beta.zip文件和对应的blog-srbac_1.2_r228.zip 问什么要下载第二个文件,后面就知道了. 按照手册进行配置: 解压缩srbac_1.3beta.z ...
- hdu 4858 项目管理(vector模拟)
# include <stdio.h> # include <algorithm> # include <string.h> # include <vecto ...