[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」树的统计的更多相关文章

  1. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  2. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

  3. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  4. BZOJ 2243:染色(树链剖分+区间合并线段树)

    [SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...

  5. HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值

    Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  6. 【Codeforces】【网络流】【树链剖分】【线段树】ALT (CodeForces - 786E)

    题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n ...

  7. LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】

    题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...

  8. HYSBZ 4034 【树链剖分】+【线段树 】

    <题目链接> 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权值.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...

  9. POJ 2763 Housewife Wind 【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一棵无向树,这棵树的有边权,这棵树的边的序号完全由输入边的序号决定.给你一个人的起点,进行两次操作: 一:该人从起点走到指定点,问你这段路径的边权总和是多少. ...

  10. HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...

随机推荐

  1. java基础4.20

    1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时 ...

  2. ThreadLocal夺命11连问

    前言 前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣. 所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少. 我把精华浓缩了一下, ...

  3. supervisor安装以及监控管理rabbitmq消费者进程

    简介:Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 1.安装 apt-get install ...

  4. 【仿真】Carla介绍与基本使用 [1] (附代码 基础版)

    0. 参考与前言 主要介绍无人驾驶的仿真环境CARLA,开源社区维护,以下为相关参考链接: Carla官方文档 建议后续找的时候 先按好版本号,有些功能/api 是新版本里有的 Carla官方gith ...

  5. JavaDoc——JavaSE基础

    JavaDoc 文档注释内容的含义 @author // 作者 @version // 版本 @since // 最早支持的Java版本 @param // 接收的参数 @return // 返回值 ...

  6. 关于string类型的大小写转换函数

    对于string类型的有力工具 transform(s.begin(), s.end(), s.begin(),::tolower)大写转小写 transform(s.begin(), s.end() ...

  7. Java系列之运算符

    运算符 算术运算符:+ (加).-(减) .*(乘)./(除).%(模).++(自增) . --(自减) 赋值运算符:= 关系运算符:>.<.>= <= == != insta ...

  8. 【Spring】AOP实现原理(二):Advisor获取

    @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring A ...

  9. VisionPro · C# · 实时取像

    VisionPro 在C#项目程序中实现实时取像方式,有两种: 1.采用界面控件  CogAcqFifoTool 进行操作,与在VisionPro软件中操作一致: 2.采用界面控件 CogRecord ...

  10. 一文搞懂jsBridge的运行机制

    我司的APP是一个典型的混合开发APP,内嵌的都是前端页面,前端页面要做到和原生的效果相似,就避免不了调用一些原生的方法,jsBridge就是js和原生通信的桥梁,本文不讲概念性的东西,而是通过分析一 ...