实现了路径修改,子树查询,及换根。

换根其实很简单,分三种情况讨论,画画图就明白了。

#include <cstdio>
#include <algorithm>
using namespace std;
#define m ((L+R)>>1)
#define lc o<<1
#define rc o<<1|1
#define ls lc,L,m
#define rs rc,m+1,R const int N = , M = ;
int n,q,e,x,y,z,op,sd,tt;
int a[N],d[N],f[N],p[N],s[N],bg[N],ed[N],sz[N],tp[N],hd[N],nxt[M],to[M],v[N<<],mn[N<<];
void add(int x, int y) {to[++e] = y, nxt[e] = hd[x], hd[x] = e;} void dfs(int x) {
int mx = ; sz[x] = ;
for(int i = hd[x]; i; i = nxt[i]) if(!d[to[i]]) {
d[to[i]] = d[x]+, f[to[i]] = x, dfs(to[i]), sz[x] += sz[to[i]];
if(sz[to[i]] > mx) mx = sz[to[i]], s[x] = to[i];
}
}
void dfs2(int x) {
bg[x] = ++tt, p[tt] = x;
if(s[x]) tp[s[x]] = tp[x], dfs2(s[x]);
for(int i = hd[x]; i; i = nxt[i]) if(to[i] != f[x] && to[i] != s[x])
tp[to[i]] = to[i], dfs2(to[i]);
ed[x] = tt;
} void bd(int o, int L, int R) {
if(L == R) {mn[o] = a[p[L]]; return;}
bd(ls), bd(rs), mn[o] = min(mn[lc], mn[rc]);
}
void pd(int o) {
if(!v[o]) return;
mn[lc] = mn[rc] = v[o], v[lc] = v[rc] = v[o], v[o] = ;
}
void gai(int o, int L, int R, int l, int r, int x) {
if(L >= l && R <= r) {v[o] = mn[o] = x; return;}
pd(o);
if(l <= m) gai(ls, l, r, x); if(r > m) gai(rs, l, r, x);
mn[o] = min(mn[lc], mn[rc]);
}
int qry(int o, int L, int R, int l, int r) {
if(L >= l && R <= r) return mn[o];
pd(o);
if(r <= m) return qry(ls, l, r); if(l > m) return qry(rs, l, r);
return min(qry(ls, l, r), qry(rs, l, r));
} void upd(int x, int y, int z) {
while(tp[x]^tp[y]) {
if(d[tp[x]] < d[tp[y]]) swap(x, y);
gai(, , n, bg[tp[x]], bg[x], z), x = f[tp[x]];
}
if(d[x] < d[y]) swap(x, y);
gai(, , n, bg[y], bg[x], z);
} int main() {
scanf("%d%d", &n, &q);
for(int i = ; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
scanf("%d", &sd), d[sd] = , tp[sd] = sd, dfs(sd), dfs2(sd), bd(, , n);
while(q--) {
scanf("%d%d", &op, &x);
if(op == ) sd = x;
else if(op == ) scanf("%d%d", &y, &z), upd(x, y, z);
else {
if(sd == x) printf("%d\n", mn[]);
else if(bg[x] > bg[sd] || ed[x] < bg[sd]) printf("%d\n", qry(,,n,bg[x],ed[x]));
else {
for(int i = hd[x]; i; i = nxt[i])
if(to[i] != f[x] && bg[to[i]] <= bg[sd] && ed[to[i]] >= bg[sd]) {
int ans = qry(,,n,,bg[to[i]]-);
if(ed[to[i]]^n) ans = min(ans, qry(,,n,ed[to[i]]+,n));
printf("%d\n", ans);
break;
}
}
}
}
return ;
}

树链剖分模板(BZOJ3083)的更多相关文章

  1. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  2. 算法复习——树链剖分模板(bzoj1036)

    题目: 题目背景 ZJOI2008 DAY1 T4 题目描述 一棵树上有 n 个节点,编号分别为 1 到 n ,每个节点都有一个权值 w .我们将以下面的形式来要求你对这棵树完成一些操作:I.CHAN ...

  3. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

  4. bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题

    [ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...

  5. BZOJ 1036 树的统计Count 树链剖分模板题

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将 ...

  6. BZOJ 1036 [ZJOI2008]树的统计Count | 树链剖分模板

    原题链接 树链剖分的模板题:在点带权树树上维护路径和,最大值和单点修改 这里给出几个定义 以任意点为根,然后记 size (u ) 为以 u 为根的子树的结点个数,令 v 为 u 所有儿子中 size ...

  7. bzoj1036 树的统计 树链剖分模板

    题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...

  8. 洛谷 P3384 树链剖分(模板题)

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  9. QTREE 树链剖分---模板 spoj QTREE

    <树链剖分及其应用> 一文讲得非常清楚,我一早上就把他学会了并且A了这题的入门题. spoj QTREE 题目: 给出一棵树,有两种操作: 1.修改一条边的边权. 2.询问节点a到b的最大 ...

随机推荐

  1. 偶遇vue-awesome-swiper的坑

    最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...

  2. 使用JDBC中的出现的乱码和查询无结果问题

    使用JDBC中的问题 连接的后出现查询结果是乱码. 1.可能是代码的编码与数据库的编码不同 ​ 有可以将二者都设置为UTF-8 2.如果比较懒得话可以只设代码为UTF-8 mysql 连接url中us ...

  3. 遍历JSON

    第一种: each,不做详细说明,太常用了 第二种:我用来遍历单个组,实现前端界面绑定 for(var item in person){ alert("person中"+item+ ...

  4. H5新特性之webWorker

    众所周知javascript是单线程语言,这就是js开发难度较低的原因了,因为不需要解决多线程的资源共享问题(例如死锁),但是单线程性能并不好,因此多了一个webWorker实现js的多进程来提升js ...

  5. HDFS文件读写操作(基础基础超基础)

    环境 OS: Ubuntu 16.04 64-Bit JDK: 1.7.0_80 64-Bit Hadoop: 2.6.5 原理 <权威指南>有两张图,下次po上来好好聊一下 实测 读操作 ...

  6. Python-socket网络编程-Day8

    目录Day8-Python socket 11.Socket 11.1.socket和file的区别: 11.2.WEB服务应用: 21.3.更多功能 21.4.socket方法: 41.5. 服务端 ...

  7. vuex在项目中使用的一点总结

    以下为vue后台管理项目中使用vuex的一点总结,截取了其中部分代码,如有什么错误,还望指出. 1. token 存储 登陆成功之后,需要把获取到的 token 存储到 vuex 中,配合 axios ...

  8. 新概念英语(1-97)A Small Blue Case

    Lesson 97 A small blue case 一只蓝色的小箱子 Listen to the tape then answer this question. Does Mr. Hall get ...

  9. Spring Security入门(2-3)Spring Security 的运行原理 3

    关键组件关系 FilterSecurityInterceptor--- authenticationManager --- UserDetailService--- accessDecisionMan ...

  10. c#:ThreadPool实现并行分析,并实现线程同步结束

    背景: 一般情况下,经常会遇到一个单线程程序时执行对CPU,MEMORY,IO利用率上不来,且速度慢下问题:那么,怎么解决这些问题呢? 据我个人经验来说有以下两种方式: 1.并行.多线程(Parall ...