[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. Promise与async/await与Generator

    Promise是什么: Promise是异步微任务(process.nextTick.Promise.then() catch() finally()等),用于解决异步多层嵌套回调的问题(回调地狱-- ...

  2. 并发编程之volatile与JMM多线程内存模型

    一.通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码.这段代码的逻辑很简单:主线程启动了两个子线程,一个线程1.一个线程2.线程1先执行,sleep睡眠2秒钟之后 ...

  3. MongoDB是什么?非关系型数据库的优点?安装使用教程

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,由于球姐都有孩子了, ...

  4. 解决mysq服务无法正常启动问题

    在mysql的启动过程中,遇到什么问题都可以反馈给我,我都会尽力帮你们解决 第一种:通过net start mysql启动MySQL服务器时,出现以下信息 是因为在MySQL5.7以上的版本中默认的没 ...

  5. 小米 pro 笔记本双硬盘设置引导盘

    功能键 F2 进入 BIOS F12 进入 Boot 选项 步骤 小米 Pro 默认是开启了 UEFI,如果 Boot 选项没有显示出期望的系统盘,那么就是这个系统盘没有 UEFI 分区,按照这个文档 ...

  6. PyTorch框架起步

    PyTorch框架基本处理操作 part1:pytorch简介与安装 CPU版本安装:pip install torch1.3.0+cpu torchvision0.4.1+cpu -f https: ...

  7. 类型转换——JavaSE基础

    类型转换 类型判断 可以通过Instanceof关键字判断左操作数是否是右操作数的父类或本身 强制类型转换 不能对布尔值进行转换 不能将对象类型转换为不相关的类型 把高容量转向低容量时,需要进行强制类 ...

  8. STL栈与队列

    #include<queue>// 队列 #include<stack>//栈 stack<int> s;//参数也是数据类型,这是栈的定义方式 queue< ...

  9. 从零开始实现lmax-Disruptor队列(二)多消费者、消费者组间消费依赖原理解析

    MyDisruptor V2版本介绍 在v1版本的MyDisruptor实现单生产者.单消费者功能后.按照计划,v2版本的MyDisruptor需要支持多消费者和允许设置消费者组间的依赖关系. 由于该 ...

  10. Java常用类-包装类

    包装类 ​ Java中的基本类型功能简单,不具备对象的特性,为了使基本类型具备对象的特性,所以出现了包装类,就可以像操作对象一样操作基本类型数据;包装类不是为了取代基本数据类型,而是在数据类型需要使用 ...