【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 ...
随机推荐
- springboot启动报异常,Failed to load property source from location 'classpath:/application.yml'
学习springboot,在启动时抛出下图异常 往下看异常信息,找到异常的具体位置 找到application.yml文件的对应位置,发现params配置前面多了空格 去掉空格重新启动,可以了 写代码 ...
- BZOJ1016最小生成树计数 最小生成树 + 排列组合
@[最小生成樹, 排列組合] Discription 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不 ...
- 【转】 使用 Python 获取 Linux 系统信息
在本文中,我们将会探索使用Python编程语言工具来检索Linux系统各种信息.走你. 哪个Python版本? 当我提及Python,所指的就是CPython 2(准确的是2.7).我会显式提醒那些相 ...
- Koala - 使用
几天项目又加紧,样式想写又太慢! 下载考拉:http://pc6.dun.123ch.cn/download/koala%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7_30@ ...
- 为Joomla 2.5的连续插入多幅图像添加便捷方式
用过Joomla 2.5的朋友应该都知道插入很多图像时是比較麻烦的.点了文章以下的图片button,它会弹出个div,让你选择图片,每选一张.div就关闭. 再选第二张的时候,它又要你又一次选择文件夹 ...
- C# Backgroundworker(后台线程)的使用
namespace BackgroundWorkderPauseSample { public partial class MainForm : Form { BackgroundWorker wor ...
- Service Mesh vs SideCar
Istio = 微服务框架 + 服务治理 Istio 大幅降低微服务架构下应用程序的开发难度,势必极大的推动微服务的普及.个人乐观估计,随着isito的成熟,微服务开发领域将迎来一次颠覆性的变革.后面 ...
- mysql的DUPLICATE KEY
经常遇到这样的情景,向一个表里插入一条数据,如果已经存在就更新一下,用程序实现麻烦而且在并发的时候可能会有问题,这时用mysql的DUPLICATE KEY 很方便 用法如下: INSERT INTO ...
- ios+Appium+Java
To run iOS tests, you can follow these steps : (Note : I am using Java language here in Eclipse IDE ...
- eclipse无法启动问题记录
几天没开eclipse,居然报错“can not unload……”,搜索答案发现没有准确的,遵从了一个多人顶赞的办法重下eclipse,把配置文件拷贝一份,结果悲剧了,虽然能够打开了,但我之前配置的 ...