树链剖分做题记录

001. P3038 [USACO11DEC] Grass Planting G

边转点 Trick,把每个边的边权下放到这个边上深度更为深的点上。因为每个点的父边唯一。然后在树剖的时候,\(u\)\(v\) 路径上的深度最低的点直接不修改,因为深度最浅的点所对应的实际上并不是 \(u\)\(v\) 路径上的边。然后就是正常树链剖分,这题是区间加,单点查,非常简单的板子。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN = 100005;
LL n, m, Fa[MAXN], siz[MAXN], son[MAXN], depth[MAXN], top[MAXN], dfn[MAXN], dfsTime = 0;
vector<LL> Adj[MAXN];
void DFS1(LL u, LL fa)
{Fa[u] = fa; depth[u] = depth[fa] + 1; siz[u] = 1;for(LL i = 0; i < (LL)Adj[u].size(); i ++){LL v = Adj[u][i];if(v == fa) continue;DFS1(v, u);siz[u] += siz[v];if(siz[v] > siz[son[u]]) son[u] = v;}return;
}
void DFS2(LL u, LL Top)
{top[u] = Top; dfn[u] = ++ dfsTime; if(son[u]) DFS2(son[u], Top);for(LL i = 0; i < (LL)Adj[u].size(); i ++){LL v = Adj[u][i];if(v == Fa[u] || v == son[u]) continue;DFS2(v, v);}return;
}
struct Node
{LL L, R, sum, tag;
} Sgt[MAXN << 2];
void PushUp(LL o)
{Sgt[o].sum = Sgt[o << 1].sum + Sgt[o << 1 | 1].sum;return;
}
void PushDown(LL o)
{Sgt[o << 1].tag += Sgt[o].tag; Sgt[o << 1 | 1].tag += Sgt[o].tag;Sgt[o << 1].sum += Sgt[o].tag * (Sgt[o << 1].R - Sgt[o << 1].L + 1);Sgt[o << 1 | 1].sum += Sgt[o].tag * (Sgt[o << 1 | 1].R - Sgt[o << 1 | 1].L + 1);Sgt[o].tag = 0;return;
}
void BuildTree(LL o, LL L, LL R)
{if(L == R){Sgt[o] = Node{L, R, 0, 0};return;}LL mid = (L + R) >> 1;BuildTree(o << 1, L, mid); BuildTree(o << 1 | 1, mid + 1, R);PushUp(o);Sgt[o].L = Sgt[o << 1].L; Sgt[o].R = Sgt[o << 1 | 1].R;return;
}
void UpdateAdd(LL o, LL Ql, LL Qr)
{if(Ql <= Sgt[o].L && Sgt[o].R <= Qr){Sgt[o].tag ++; Sgt[o].sum += (Sgt[o].R - Sgt[o].L + 1);return;}PushDown(o);LL mid = (Sgt[o].L + Sgt[o].R) >> 1;if(Ql <= mid) UpdateAdd(o << 1, Ql, Qr);if(mid < Qr) UpdateAdd(o << 1 | 1, Ql, Qr);PushUp(o);return;
}
LL QuerySum(LL o, LL QPos)
{if(Sgt[o].L == Sgt[o].R) return Sgt[o].sum;PushDown(o);LL mid = (Sgt[o].L + Sgt[o].R) >> 1, ans = 0;if(QPos <= mid) ans += QuerySum(o << 1, QPos);else ans += QuerySum(o << 1 | 1, QPos);return ans;
}
void UpdatePath(LL u, LL v)
{while(top[u] != top[v]){if(depth[top[u]] < depth[top[v]]) swap(u, v);UpdateAdd(1, dfn[top[u]], dfn[u]);u = Fa[top[u]];}if(depth[v] < depth[u]) swap(u, v);if(u != v) UpdateAdd(1, dfn[u] + 1, dfn[v]);return;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin >> n >> m;for(LL i = 1; i < n; i ++){LL u, v;cin >> u >> v;Adj[u].push_back(v); Adj[v].push_back(u);}DFS1(1, 0); DFS2(1, 1); BuildTree(1, 1, n);while(m --){char Opt;cin >> Opt;if(Opt == 'P'){LL u, v;cin >> u >> v;UpdatePath(u, v);}else{LL u, v;cin >> u >> v;if(depth[u] > depth[v]) cout << QuerySum(1, dfn[u]) << '\n';else cout << QuerySum(1, dfn[v]) << '\n';}}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836628.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组合数学基础 - 学习记录

组合数学基础 - 学习记录组合数学基础 - 学习笔记 代码集合 1. 加法 / 乘法原理 加法原理 指若有 \(n\) 类选择完成工程,每类选择有 \(a_i\) 个方法,总完成方法数为 \(a_1+a_2+ \cdots +a_n\) 乘法原理 指若有 \(n\) 个步骤完成工程,每个步骤有 \(a_i\) 种方法,总完成方法数…

『玩转Streamlit』--交互类组件

交互类组件在Web应用程序中至关重要,它们允许用户与应用进行实时互动,能够显著提升用户体验。 用户不再只是被动地接收信息,而是可以主动地输入数据、做出选择或触发事件,从而更加深入地参与到应用中来。 此外,对于某些复杂的任务或操作,交互类组件可以将其分解成一系列简…

Jfinal框架运行时,端口号被占用

下载完Jfinal后按照启动说明,发现出现端口号被占用的问题 我们只需要去undertow.txt文件里面寻找undertow.port=80将修改成undertow.port=8080就可以运行成功了

Rust 的静态网站生成器「GitHub 热点速览」

如果你做过个人博客网站,那么一定对静态网站生成器不陌生。无论是 Ruby 语言的 Jekyll、Go 语言的 Hugo、还是基于 React 的 Gatsby,这些工具都有庞大的用户群体。对于喜欢的人来说,它们是无可替代的神器,而对于不喜欢的人,则可能难以“下咽”。正如俗话所说,“萝卜青菜,…

Mysql篇-语句执行计划详解(explain)

概述 使用 explain 输出 SELECT 语句执行的详细信息,包括以下信息:表的加载顺序 sql 的查询类型 可能用到哪些索引,实际上用到哪些索引 读取的行数Explain 执行计划包含字段信息如下:分别是 id、select_type、table、partitions、type、possible_keys、key、key_len、ref、…

永宏BI-设置报告全屏自适应

制作报告 - 查看 -自适应设置全屏自适应查看报告 - 演示 - 手动演示 即可全屏展示

Ubuntu-22.04 挂载磁盘

查看系统磁盘情况 fdisk 或者 lsblk -f新建挂载磁盘名称,类似于windows的盘符。例如我们新建一个 data,专门存放生产数据 cd / mkdir data 确保sdb盘新盘或者数据已备份,格式化sdb盘为ext4格式 sudo mkfs -t ext4 /dev/sdb 手动挂载 sudo mount /dev/sdb /data 查看磁盘挂载…

项目UML图(2)

1.用例图2.类图3.时序图

读数据质量管理:数据可靠性与数据质量问题解决之道08扩展异常检测

扩展异常检测1. Python和机器学习扩展异常检测 1.1. 机器学习有助于大规模数据可观测性和数据监控1.1.1. 配备了机器学习的检测器可以更灵活地应用到更多的数据表上,从而消除了随着数据仓库或数据湖的增长进行手动检查和手动操作的需要1.1.2. 机器学习检测器可以实时学习和适应…

笼统的数据处理

通常来说,根据数据类型可以将编程语言分为两类:强类型语言强类型语言(Strongly typed language)不仅强制要求事先声明变量,还要求声明每个变量的数据类型,这样编译器就能准确地知道这个变量中的值的类型。强类型语言在数据类型上要求很严格:必须事先说明变量中存放的数据…

GitLab私有仓库概述及环境部署

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.gitlab概述1.gitlab介绍2.gitlab架构3.gitlab推荐配置二.部署gitlab前准备1.ubuntu系统环境安装前准备1.1 配置Ubuntu主机名1.2 配置Ubuntu远程链接1.3 配置ubuntu仓库1.4 修改终端颜色1.5 重启虚拟机…