【题目链接】

点击打开链接

【算法】

树链剖分模板题

【代码】

#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】树的统计的更多相关文章

  1. zjoi 2008 树的统计——树链剖分

    比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...

  2. C++之路进阶——codevs2460(树的统计)

    2460 树的统计 2008年省队选拔赛浙江  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 一棵树上有n个节 ...

  3. 2008ZJOI树的统计

    codevs 2460 树的统计 http://codevs.cn/problem/2460/ 2008年省队选拔赛浙江  题目等级 : 大师 Master   题目描述 Description 一棵 ...

  4. Codevs 2460 == BZOJ 1036 树的统计

     2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...

  5. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  6. bzoj1036 [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 12646  Solved: 5085 [Subm ...

  7. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 14354  Solved: 5802 [Subm ...

  8. 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分

    [BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...

  9. BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)

    潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...

  10. BZOJ 1036 树的统计-树链剖分

    [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...

随机推荐

  1. Maven实战:Pom.xml详解

    什么是pom?    pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的u ...

  2. OSI模型详解

    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...

  3. spring解决乱码

    spring提供的工具类解决乱码问题 在web.xml配置中添加如下代码: <!--乱码处理--> <filter> <filter-name>encodingFi ...

  4. 微软CIO如何与业务部门打交道?

    微软公司副总裁兼CIO Tony Scott是一个非常智慧的人,他拒绝和CEO讨论IT成本的问题,认为IT不应该谈论成本,而是应该谈论IT提供服务的价值.在满足业务部门需求.为业务部门提供适当的IT支 ...

  5. 上手ReactiveCocoa之基础篇

    转自 --> http://www.jianshu.com/p/87ef6720a096 前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCoco ...

  6. 如何绕过Win8、Win10的systemsetting与注册表校验设置默认浏览器

    *本文原创作者:浪子_三少,属Freebuf原创奖励计划,未经许可禁止转载 在win7时我们只需修改注册表就能设置默认浏览器,但是win8.win10下不能直接修改的因为同样的注册表项,win8.wi ...

  7. SolidEdge 如何绘制零件图的剖视图

    1 点击检视-剖面,然后选择剖切面   2 比如要全剖,则绘制好方框之后点返回,选择方向.   选择剖切深度,然后预览即可   一个零件可以进行多次剖切

  8. SolidEdge 工程图中如何快速将同一类元素放到同一个图层

    在图层选项卡中新建一个尺寸线图层   点击聪慧选项(把它点凹下去),然后点击任意尺寸线,弹出聪慧选取选项,点击确定,则自动选择了所有尺寸线   点击移动图元,把刚才选中的所有尺寸线都移动到这个图层即可 ...

  9. grunt 试用笔记

    Gruntjs是JavaScript项目的构建工具,也是基于node的一个命令行工具.很多开源JS项目都是使用它搭建.如jQuery.Qunit.CanJS等.它有以下作用 合并JS文件压缩JS文件单 ...

  10. 提高系统性能——对SQL语句优化的思考

    软件在研发的过程中自始至终都在留意着系统的可扩展性.但与此同一时候也在关注着系统的性能,SQL语句作为系统性能的一环不容忽视.从今天開始结合开发的经验,谈一下我对SQL语句优化的理解和认知: 1.在联 ...