【题目链接】

点击打开链接

【算法】

树链剖分模板题

【代码】

#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. koa2 从入门到进阶之路 (一)

    首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...

  2. ZOJ - 4016 Mergeable Stack (STL 双向链表)

    [传送门]http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 [题目大意]初始有n个空栈,现在有如下三种操作: (1) ...

  3. Hadoop 连接mysql

    1 mysql数据导入到hdfs数据 hadoop提供了org.apache.hadoop.io.Writable接口来实现简单的高效的可序列化的协议,该类基于DataInput和DataOutput ...

  4. 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载

    apple sample lazytableimages 1,首先设置横向显示的uitableview self.customTableview.transform = CGAffineTransfo ...

  5. Linux常用C函数-接口处理篇(网络通信函数)

    接口处理篇accept,bind,connect,endprotoent,endservent,getsockopt,htonl,htons,inet_addr,inet_aton,inet_ntoa ...

  6. Spring4+SpringMVC+Hibernate4整合入门与实例

    配置web.xml <? xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&q ...

  7. router的安装和基本配置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 手把手编写自己的PHPMVC框架

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  9. UnsatisfiedLinkError: No implementation found for , AndroidStudio使用*.so

    今天工作的时候.发现了一个jni的问题,java.lang.UnsatisfiedLinkError: No implementation found for...... 问题1:后来查了资料后发现. ...

  10. Hadoop之HDFS文件操作

    摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...