[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. MybatisCodeHelperPro简单使用

    1.idea安装 2.连接mysql 3.创建实体等关联类 ,选择数据库表右键选择如图 4配置 生成后的 5简单应用 可以直接生成xml 总结:非常的方便快捷.

  2. CSS书写及命名规范

    1.样式书写顺序 positioning定位::position.display.float.top. right.bottom.left.overflow.clear.z-index: box mo ...

  3. this-2

    读起来使你有新认识或可以使你离更确切的定义更近时的文章不应该被忽略.thisthis既不指向函数自身,也不指向函数的词法作用域(ES6中箭头函数采用词法作用域).this实际上是函数被调用时才发生绑定 ...

  4. 基于DEM的坡度坡向分析

    坡度坡向分析方法 坡度(slope)是地面特定区域高度变化比率的量度.坡度的表示方法有百分比法.度数法.密位法和分数法四种,其中以百分比法和度数法较为常用.本文计算的为坡度百分比数据.如当角度为45度 ...

  5. 我用13行摆烂了你的oj4

    13行代码AC oj4是怎么回事呢?13行代码AC oj4相信大家都很熟悉,但是13行代码AC oj4是怎么回事呢,下面就让小编带大家一起了解吧.13行代码AC oj4,其实就是13行代码AC oj4 ...

  6. 929. Unique Email Address - LeetCode

    Question 929. Unique Email Address Solution 题目大意: 给你一个邮箱地址的数组,求出有多少个不同的地址,其中localName有如下规则 加号(+)后面的字 ...

  7. nginx反向代理获取用户真实ip

    nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...

  8. 520表白小程序设计Python代码详解(PyQt5界面,B站动漫风)

    摘要:介绍一个动漫风的表白小程序,界面使用Python以及PyQt实现,界面样式经过多次美化调整,使得整体清新美观.本文详细介绍代码设计和实现过程,不仅是居家表白必备,而且适合新入门的朋友学习界面设计 ...

  9. DOM标签操作与事件与jQuery查找标签

    目录 DOM之操作标签 创建标签对象 标签对象的属性 innerText与innerHTML 标签内部追加内容 属性操作 事件 常用事件 事件绑定 事件案例 jQuery简介 查找标签 基本选择器 属 ...

  10. Asp.Net Core Identity 多数据库支持

    Asp.Net Core Identity 是.Net自带的身份认证系统,支持用户界面 (UI) 登录功能,并且管理用户.密码.配置文件数据.角色.声明.令牌.电子邮件确认等等.使用Visual St ...