【一本通提高树链剖分】「ZJOI2008」树的统计
[ZJOI2008]树的统计
题目描述
一棵树上有
n
n
n 个节点,编号分别为
1
1
1 到
n
n
n,每个节点都有一个权值
w
w
w。
我们将以下面的形式来要求你对这棵树完成一些操作:
I. CHANGE u t
: 把结点
u
u
u 的权值改为
t
t
t。
II. QMAX u v
: 询问从点
u
u
u 到点
v
v
v 的路径上的节点的最大权值。
III. QSUM u v
: 询问从点
u
u
u 到点
v
v
v 的路径上的节点的权值和。
注意:从点
u
u
u 到点
v
v
v 的路径上的节点包括
u
u
u 和
v
v
v 本身。
输入格式
输入文件的第一行为一个整数
n
n
n,表示节点的个数。
接下来
n
−
1
n-1
n−1 行,每行
2
2
2 个整数
a
a
a 和
b
b
b,表示节点
a
a
a 和节点
b
b
b 之间有一条边相连。
接下来一行
n
n
n 个整数,第
i
i
i 个整数
w
i
w_i
wi 表示节点
i
i
i 的权值。
接下来
1
1
1 行,为一个整数
q
q
q,表示操作的总数。
接下来
q
q
q 行,每行一个操作,以 CHANGE u t
或者 QMAX u v
或者 QSUM u v
的形式给出。
输出格式
对于每个 QMAX
或者 QSUM
的操作,每行输出一个整数表示要求输出的结果。
输入输出样例
样例输入1
4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
样例输出1
4
1
2
2
10
6
5
6
5
16
说明/提示
对于
100
%
100 \%
100% 的数据,保证
1
≤
n
≤
3
×
1
0
4
1\le n \le 3\times 10^4
1≤n≤3×104,
0
≤
q
≤
2
×
1
0
5
0\le q\le 2\times 10^5
0≤q≤2×105。
中途操作中保证每个节点的权值
w
w
w 在
−
3
×
1
0
4
-3\times 10^4
−3×104 到
3
×
1
0
4
3\times 10^4
3×104 之间。
Code
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast")
#include <bits/stdc++.h>
using namespace std;
const int N = 30005;
stack<int>s;
int n, m, q;
char ch[10];
struct lct
{
int fa, c[2], rev, val, sm, mx;
inline int &operator[] (int x)
{
return c[x];
}
} t[N];
void pushup(int x)
{
int ls = t[x][0], rs = t[x][1];
t[x].sm = t[ls].sm + t[rs].sm + t[x].val;
t[x].mx = max(max(t[ls].mx, t[rs].mx), t[x].val);
}
void pushdown(int x)
{
int ls = t[x][0], rs = t[x][1];
if (t[x].rev)
t[ls].rev ^= 1, t[rs].rev ^= 1,swap(t[x][0], t[x][1]), t[x].rev = 0;
}
bool pdrt(int x)
{
return t[t[x].fa][0] != x && t[t[x].fa][1] != x;
}
void rotate(int x)
{
int y = t[x].fa, z = t[y].fa, dy = (t[y][1] == x), dz = (t[z][1] == y);
if (!pdrt(y))
t[z][dz] = x;
t[y][dy] = t[x][dy ^ 1], t[t[x][dy ^ 1]].fa = y;
t[x][dy ^ 1] = y, t[y].fa = x, t[x].fa = z;
pushup(y);
}
void splay(int x)
{
s.push(x);
for (int i = x; !pdrt(i); i = t[i].fa)
s.push(t[i].fa);
while (s.size())
pushdown(s.top()), s.pop();
while (!pdrt(x))
{
int y = t[x].fa;
int z = t[y].fa;
if (!pdrt(y))
if (t[y][1] == x ^ t[z][1] == y)
rotate(x);
else
rotate(y);
rotate(x);
}
pushup(x);
}
void access(int x)
{
for (int i = 0; x; x = t[x].fa)
splay(x), t[x][1] = i, i = x;
}
void mkrt(int x)
{
access(x), splay(x), t[x].rev ^= 1;
}
int main()
{
scanf("%d", &n);
t[0].mx = -99999;
for (int i = 1, x, y; i < n; i++)
scanf("%d%d", &x, &y), mkrt(x), t[x].fa = y;
for (int i = 1; i <= n; i++)
splay(i),
scanf("%d", &t[i].val), pushup(i);
scanf("%d", &q);
while (q--)
{
int x, y;
scanf("%s%d%d", ch, &x, &y);
if (ch[1] == 'H')
splay(x),
t[x].val = y, pushup(x);
else if (ch[1] == 'M')
{
mkrt(x);
access(y);
splay(y);
printf("%d\n", t[y].mx);
}
else
{
mkrt(x);
access(y);
splay(y);
printf("%d\n", t[y].sm);
}
}
return 0;
}
广告
绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/
绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/
(现在使用,人人均可获得300元大奖)
【一本通提高树链剖分】「ZJOI2008」树的统计的更多相关文章
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector
题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2243:染色(树链剖分+区间合并线段树)
[SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...
- HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值
Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- 【Codeforces】【网络流】【树链剖分】【线段树】ALT (CodeForces - 786E)
题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n ...
- LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】
题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...
- HYSBZ 4034 【树链剖分】+【线段树 】
<题目链接> 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权值.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...
- POJ 2763 Housewife Wind 【树链剖分】+【线段树】
<题目链接> 题目大意: 给定一棵无向树,这棵树的有边权,这棵树的边的序号完全由输入边的序号决定.给你一个人的起点,进行两次操作: 一:该人从起点走到指定点,问你这段路径的边权总和是多少. ...
- HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】
<题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...
随机推荐
- java基础4.20
1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时 ...
- ThreadLocal夺命11连问
前言 前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣. 所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少. 我把精华浓缩了一下, ...
- supervisor安装以及监控管理rabbitmq消费者进程
简介:Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 1.安装 apt-get install ...
- 【仿真】Carla介绍与基本使用 [1] (附代码 基础版)
0. 参考与前言 主要介绍无人驾驶的仿真环境CARLA,开源社区维护,以下为相关参考链接: Carla官方文档 建议后续找的时候 先按好版本号,有些功能/api 是新版本里有的 Carla官方gith ...
- JavaDoc——JavaSE基础
JavaDoc 文档注释内容的含义 @author // 作者 @version // 版本 @since // 最早支持的Java版本 @param // 接收的参数 @return // 返回值 ...
- 关于string类型的大小写转换函数
对于string类型的有力工具 transform(s.begin(), s.end(), s.begin(),::tolower)大写转小写 transform(s.begin(), s.end() ...
- Java系列之运算符
运算符 算术运算符:+ (加).-(减) .*(乘)./(除).%(模).++(自增) . --(自减) 赋值运算符:= 关系运算符:>.<.>= <= == != insta ...
- 【Spring】AOP实现原理(二):Advisor获取
@EnableAspectJAutoProxy @EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring A ...
- VisionPro · C# · 实时取像
VisionPro 在C#项目程序中实现实时取像方式,有两种: 1.采用界面控件 CogAcqFifoTool 进行操作,与在VisionPro软件中操作一致: 2.采用界面控件 CogRecord ...
- 一文搞懂jsBridge的运行机制
我司的APP是一个典型的混合开发APP,内嵌的都是前端页面,前端页面要做到和原生的效果相似,就避免不了调用一些原生的方法,jsBridge就是js和原生通信的桥梁,本文不讲概念性的东西,而是通过分析一 ...