BZOJ 1036 树的统计 | 树链剖分模板题
又做了一遍……去掉读入优化只有八十行~
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define space putchar(' ')
#define enter putchar('\n')
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 30005;
int n, m;
int ecnt, adj[N], go[2*N], nxt[2*N];
int tot, dep[N], fa[N], son[N], top[N], sze[N], val[N], pos[N], idx[N];
int sum[4*N], mx[4*N];
void add(int u, int v){
go[++ecnt] = v;
nxt[ecnt] = adj[u];
adj[u] = ecnt;
}
void pushup(int k){
sum[k] = sum[k << 1] + sum[k << 1 | 1];
mx[k] = max(mx[k << 1], mx[k << 1 | 1]);
}
void build(int k, int l, int r){
if(l == r) return (void)(sum[k] = mx[k] = val[idx[l]]);
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
pushup(k);
}
void change(int k, int l, int r, int p, int x){
if(l == r) return (void)(sum[k] = mx[k] = x);
int mid = (l + r) >> 1;
if(p <= mid) change(k << 1, l, mid, p, x);
else change(k << 1 | 1, mid + 1, r, p, x);
pushup(k);
}
int query(int k, int l, int r, int ql, int qr, bool is_sum){
if(ql <= l && qr >= r) return is_sum ? sum[k] : mx[k];
int mid = (l + r) >> 1;
if(qr <= mid) return query(k << 1, l, mid, ql, qr, is_sum);
if(ql > mid) return query(k << 1 | 1, mid + 1, r, ql, qr, is_sum);
if(is_sum) return query(k << 1, l, mid, ql, qr, 1) + query(k << 1 | 1, mid + 1, r, ql, qr, 1);
else return max(query(k << 1, l, mid, ql, qr, 0), query(k << 1 | 1, mid + 1, r, ql, qr, 0));
}
int path_query(int u, int v, bool is_sum){
if(top[u] == top[v]){
if(pos[u] > pos[v]) swap(u, v);
return query(1, 1, n, pos[u], pos[v], is_sum);
}
if(dep[top[u]] > dep[top[v]]) swap(u, v);
if(is_sum) return query(1, 1, n, pos[top[v]], pos[v], 1) + path_query(fa[top[v]], u, 1);
else return max(query(1, 1, n, pos[top[v]], pos[v], 0), path_query(fa[top[v]], u, 0));
}
void init(){
static int que[N], qr;
que[qr = 1] = 1;
for(int ql = 1, u; ql <= qr; ql++){
u = que[ql], dep[u] = dep[fa[u]] + 1, sze[u] = 1;
for(int e = adj[u], v; e; e = nxt[e])
if(v = go[e], v != fa[u])
fa[v] = u, que[++qr] = v;
}
for(int ql = qr, u; ql; ql--){
u = que[ql];
sze[fa[u]] += sze[u];
if(sze[u] >= sze[son[fa[u]]]) son[fa[u]] = u;
}
for(int ql = 1, u; ql <= qr; ql++)
if(!top[u = que[ql]])
for(int v = u; v; v = son[v])
top[v] = u, pos[v] = ++tot, idx[tot] = v;
build(1, 1, n);
}
int main(){
read(n);
for(int i = 1, u, v; i < n; i++)
read(u), read(v), add(u, v), add(v, u);
for(int i = 1; i <= n; i++)
read(val[i]);
init();
read(m);
int u, v;
char op[10];
while(m--){
scanf("%s", op);
read(u), read(v);
if(op[0] == 'C') change(1, 1, n, pos[u], v);
else write(path_query(u, v, op[1] == 'S')), enter;
}
return 0;
}
BZOJ 1036 树的统计 | 树链剖分模板题的更多相关文章
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- BZOJ 1036: [ZJOI2008]树的统计Count (树链剖分模板题)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14982 Solved: 6081[Submit ...
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- BZOJ 1036 树的统计Count 树链剖分模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将 ...
- 【BZOJ 1036】【ZJOI 2008】树的统计 树链剖分模板题
sth神犇的模板: //bzoj1036 题目:一个n个点的树每个点有一个权值,支持修改单点权值,求某两点路径上的点权和或最大点权. #include <cstdio> using nam ...
- bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题
[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...
- 洛谷 P3384 树链剖分(模板题)
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- 洛谷 P2146 [NOI2015]软件包管理器 (树链剖分模板题)
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- spoj - Grass Planting(树链剖分模板题)
Grass Planting 题意 给出一棵树,树有边权.每次给出节点 (u, v) ,有两种操作:1. 把 u 到 v 路径上所有边的权值加 1.2. 查询 u 到 v 的权值之和. 分析 如果这些 ...
随机推荐
- 使用着色器在WebGL3D场景中呈现行星表面地形
实验目的:按照一定规律生成类地行星地表地形区块,并用合理的方式将地形块显示出来 涉及知识:Babylon.js引擎应用.着色器编程.正态分布.数据处理.canvas像素操作 github地址:http ...
- 【Shader】这是一篇记录随笔,我要开始学Shader了!
背景: 前天学校有场招聘会,转了一圈只看到一家和unity有关的公司,还是做VR游戏的,然后HR也很好说话.和我说话的HR正好是做UnityVR方面的,聊了会受益匪浅,自己就像是找到了方向似的,突然很 ...
- SQL Operations Studio的安装和使用
之前管理和访问SQL SERVER使用的自然是SSMS,功能确实很强大的一个数据库图形化管理软件,但是SSMS有个问题就是体积超级大,启动速度也就比较慢.今天我正好要学习一些T-SQL的内容,在微软的 ...
- more和less命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/aijianshi/p/5750911.html 一.more命令 more功能类似 cat ,cat命令是整个文件的内 ...
- PLSQL Developer windows 64位连接数据库的问题
使用PLSQL Developer 工具连接到数据库进行开发,目前主流windows 系统都是64位操作系统,而PLSQL Developer 只有32位程序,所以在连接数据库上遇到一些问题. PL ...
- 为什么找程序员一定要看他的 GitHub
听说 最开始听到这句话是某知名互联网公司大牛告诉我的,我很不以为然,不过迫于他是"leader"我也注册了一个 highsea (广告 0.0):当然我可懒得 push 更别提 c ...
- Linux基础入门--04
目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...
- DPDK实例程序:testpmd
用户手册:https://doc.dpdk.org/guides/testpmd_app_ug/index.html 还不错的入门:http://syswift.com/188.html 我的运行情况 ...
- python learning Regular Expression.py
# 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规 ...
- java集合LinkedList
基于jdk_1.8.0 关于List,主要是有序的可重复的数据结构.jdk主要实现类有ArrayList(底层使用数组).LinkedList(底层使用双向链表) LinkedList: (一)继承关 ...