【一本通提高树链剖分】「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(模板题)【树链剖分】+【线段树】
<题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...
随机推荐
- linux部署项目(前后端分离项目)
参考博客 技术栈 路飞学城部署 vue + nginx + uwsgi + django + mysql + redis(就是一个key - value型数据库,缓存型数据库,内存型数据库) 部署步骤 ...
- os、json、sys、subprocess模块
os模块 import os 1.创建目录(文件夹) os.mkdir(r'a') # 相对路径 只能创建单级目录 os.makedirs(r'a\b') # 可以创建单级和多及目录 2.删除目录 o ...
- 操作系统实现-printk
博客网址:www.shicoder.top 微信:18223081347 欢迎加群聊天 :452380935 这一次我们来实现最基础,也是最常见的函数print,大家都知道这个是可变参数函数,那具体怎 ...
- 渗透:aircrack-ng
ircrack- NG是一个完整的工具来评估Wi-Fi网络安全套件,功能包括: 监控:数据包捕获和导出数据到文本文件,以供第三方工具进一步处理. 攻击:通过数据包注入回放攻击,去认证,伪造接入点等. ...
- CentOS6.x静默安装Oracle12c
一.准备 1.1 安装环境 系统要求 内存 > 2G 安装目录空间 > 6.5G /tmp目录空间 > 1G 操作系统 cat /etc/redhat-release 用rpm命令确 ...
- PostGIS 扩展创建失败原因调查
Issue 升级 PostgreSQL 9.1 的一个集群,由于该集群用到了 PostGIS,在升级 PostgreSQL 时也需要升级一下 PostGIS.PostGIS 相关软件安装好后,在 Po ...
- 基础篇:java GC 总结,建议收藏
垃圾标记算法 垃圾回收算法 major gc.mini gc.full gc.mixed gc 又是什么,怎么触发的 垃圾回收器的介绍 Safe Point 和 Safe Region 什么是 TLA ...
- Docker安装Mycat和Mysql进行水平分库分表实战【图文教学】
一.前言 小编最近公司有个新的需求,数据量比较大,要涉及到分库分表.大概了解了一些主流的中间件,使用和网上资料比较多的是Mycat和sharding-jdbc,小编比较倾向于Mycat.原因很简单就是 ...
- 高通(QCOM)sensor bring up
高通7150平台 1.添加驱动文件 2.添加编译 3.配置json文件 4.高通默认配置 5.部分sensor外挂电源 6.遇到的问题 1.添加驱动文件 路径:adsp_proc/ssc/sensor ...
- 我用 AntV/S2 买了一套房
背景 经过一年多的摇号,我在前两天收到了某网红盘的摇中通知.还沉浸在摇中房屋喜悦中的我,很快被售房顾问告知选房的人很多,每位购房者的选房时间都很短,必须 一分钟内 快速选房.并且,排在 400 多号的 ...