一定要在noip之前把自己花钱买的Luogu网课梳理完!QAQ

树上前缀和:

对于有根树,在每个点记录 val (点权) 和 sum(到根的点权之和)

当然记录的值因题而异(但是既然叫树上前缀和当然就要这么定义啊)

就可以做一些奇奇怪怪的操作了。

还是看题来理解这玩意儿的妙用吧2333

EG1

给定树和各点点权,t次询问,每次求u到v路径上的点权和。(1e5)

是道板子题了。

从根开始dfs,到每个点时记录该点的val和sum

其中sum为该点到祖先路径上点权之和,包括自己。

每次输出sum[u]+sum[v]-2*sum[lca(u,v)]+val[lca(u,v)]。

EG2

给定初始点权为0的树,n次操作,每次对u,v路径上每点+x。
求最后每点点权。(1e5)

运用差分思想。

对每个点记录一个val值,初始为0。

对于每次操作:

如图,两个深色的是u和v,黄色是u,v的路径。

推一推就会神奇(并不)的发现,每个点的真实点权就是该点的子树点权和。

val[u]+=x;
val[v]+=x;
val[lca(u,v)]-=x;
if(fa[lca(u,v)]!=lca[u,v])fa[lca(u,v)]-=x;

实现O(4)修改,最后用O(n)得到答案。

“经典的树上差分。”——ddd

EG3

给定树,边有边权。
求有多少对(u,v)使u,v路上所有边的边权异或和为0(1e5)其中异或和=所有数异或起来的结果

记sum[x]为x到祖先的异或和。

由于异或有:

a xor a = 0

所以如下图,在sum[u] xor sum[v]时,lca以上的屎色线已经被消掉了。

所以ans=sum[u] xor sum[v]

问题转化为:有1e5个数(sum),求中间有多少对数异或和=0

也就是有多少对相等的数。

用一个map记录,然后遍历map就行了。

EG4(留坑

给定一棵N个节点的树,每个点有一个权值val(1e9),对于第M(1e5)个询问(u,v,k),回答u和v这两个节点间第K小的点权。

权值线段树+前缀和。

前置知识:

权值线段树:以val为下标的树。EG:

对于序列版本(在序列上问l到r之间第k大的数):

每加入一个新的点,只会对权值线段树上的logn个点产生影响。

所以从左往右每加入一个新点,就可持久化一下。

对于每个询问,算出[1,l-1]的权值线段树和[l,r]的权值线段树,减一下就星了。

(以下照抄ppt)

“对于树上版本,每个点从其父亲的版本可持久化而来。

那么对于一条路径,和树上前缀和一样,由4棵线段树即可提取出这条路径表示的权值线段树。

再在线段树上查询即可。”

好像还要四个主席树怎么搞一搞吧2333

我连可持久化都不会你跟我说这些东西?!!

DFS序

此物如名,就是dfs的顺序。

如图,如果按照前序遍历(根->左->右)去搜的话,搜索序就会是这样。

搜索的方法可以 根左右 可以 根右左 ,记录也有 只在进入时记一次 和 进入弹出都记 啊什么的,大同小异。

对于我们现在讨论的这种dfs序,有这样一个神奇的性质:

一个树的子树中的点,在dfs序上是连续的。换言之,设该点为i,它在dfs序上的位置为pos,子树大小为siz。则它的子树中的点在[pos,pos+siz-1]上。

这玩意儿我们可以联系代码解释:

1 void dfsx(int x)
2 {
3     cout<<x<<" ";
4     for(int i=heap[x];i;i=a[i].next)
5     {
6         dfsx(a[i].to);
7     }
8     return;
9 }

差不多是这样,想一想就能通了(吧)

EG

给定一棵有n个节点的树。
有两种操作:
1.给u的子树上每点+v
2.求u的子树上的点权和(1e5)

是道板子题了。

根据我们之前搞出来的dfs序,可以把对子树的操作转化为区间问题(区间加 区间求和)

然后线段树就行了。

以及dfs序还在LCA的ST法上有用,多年前的ST学习笔记。

树链剖分(轻重链剖分)

对于一个点,我们记它的所有儿子中,子树最大的一个儿子为重儿子,连接该儿子的边为重边(深色边);否则为轻边。

如图。

性质:从根到某一点的路径上,有不超过logn条轻边,不超过logn条重边。

代码实现方面:(口胡ing 等我口胡完就代码实现

首先扫一遍,得到哪些点是重儿子->哪些边是重边然后对每个点,记fa[x]为x的父节点,top[x]为x在只走重链的前提下的祖先

恭喜你得到了一棵剖好了的树!

LCA(1e5)

对于u,v:若top[u]==top[v],则lca为u,v中深度较小的那个点;否则把链头较深的点 跳到链头的父亲处。

本质上还是算暴力跳的鬼畜优化吧(挠头

LA(一个点向上x步的祖先)(1e5)

对于查询u向上x步:
设当前点dep[u],目标祖先的dep就是dep[u]-x;
如果top[u]的dep比目标dep深,那么跳到链头的父亲处;(logn)
否则:
目标点肯定在当前点到top的路上。
也就是在这条重链上,所以在dfs序上连续。
从而所求点的dfn就是 top的dfn 加上 它到top的dep差。O(1)

EG6

树剖模板。

我解决掉啦!

EG7

给定树,有点权。

操作:1.从u到v路径上每点点权+t

2.求所有于u点相邻的点的点权和

记每个点的轻儿子之和为sum[x]。

对于每次修改,暴力做轻儿子(树剖嘛)

每次查询该点的sum和重儿子和fa。

换根意义下的操作

————to be continued

转载于:https://www.cnblogs.com/qwerta/p/9600669.html

「咕咕网校 - 基础省选」树上问题的进阶 by Drench相关推荐

  1. 基础省选+NOI-第2部分 数据结构进阶(II)

    1.量产数据结构 [暖*墟] #洛谷省选网课# 7.30量产数据结构 - 花神&缘浅flora - 博客园 [暖*墟] #洛谷省选网课# 7.30量产数据结构_flora715的博客-CSDN ...

  2. 基础省选+NOI-第1部分 数据结构进阶(I)

    1.莫队 HRBU ACM 莫队 线段树 树状数组_哔哩哔哩_bilibili 莫队+ST表综合题 洛谷p3246[HNOI]序列_哔哩哔哩_bilibili 0325[莫队2]_哔哩哔哩_bilib ...

  3. [免费专栏] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  4. 私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027

    免责声明:本文旨在传递更多市场信息,不构成任何投资建议.文章仅代表作者观点,不代表火星财经官方立场. 小编:记得关注哦 投资区块链,猛戳:火星财经App下载 来源:学习区块链 原文标题:「区块链基础概 ...

  5. vscode php插件_「PHP从入门到颈椎病康复」基础篇——HelloWorld

    需要的前驱知识 在学习这篇文章之前,需要有一点HTML的基础,需要的小伙伴可以点开我的主页,查看<「HTML从入门到颈椎病康复」>系列文章. 啥玩意是php PHP:"超文本预处 ...

  6. php app接口开发,「PHP开发APP接口实战005」基础示例接口的实现一

    前一章,我们对接口参数基本定义做了一个简要说明.里面提到了几个示例接口,接下来,我们就来讲解这个几点个示例接口的具体实现. 「PHP开发APP接口实战004」基础响应参数说明 前言 由于我们的接口返回 ...

  7. [免费专栏] Android安全之APK应用程序分析「附带Smali基础语法解析」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  8. 正睿2019省选附加赛 Day10 (这篇其实已经都咕咕了...)

    目录 2019.3.13 A.算算算(二项式定理 斯特林数) B.买买买 C.树树树 2019.3.13 比赛链接 A.算算算(二项式定理 斯特林数) 题目链接 \(x^k\)可以用二项式定理展开,需 ...

  9. 咕咕机vs喵喵机测评

    咕咕机vs喵喵机测评 本次对比测评的机子,来自之前妹妹入手的喵喵机和我刚刚入手的咕咕机. 之前妹妹有买过喵喵机,觉得很方便想推荐给我,碰巧咕咕机推出了新款,价格合算,外表美观,于是干脆入手了咕咕机.顺 ...

  10. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!

    排序 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率. 对于排序: 我 ...

最新文章

  1. 图像处理和模式识别等技术的快速发展大大地推动了机器视觉的发展
  2. 【Java面试题】41 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?...
  3. 解决java.sql.SQLException: Parameter number X is not an OUT parameter--转
  4. Oracle SQL Developer 添加SQLServer 和Sybase 连接 .
  5. 网络协议,我明明学过的呀?
  6. highlight js 为博客增加代码着色
  7. windows 自动copy远程服务器文件
  8. Oracle12081,【Oracle介质】Oracle 12C Linux x86-64 最新OPatch patch 6880880 12.2.0.1.7
  9. ssh无秘钥登录报错sign_and_send_pubkey: signing failed: agent refused operation
  10. 20155317 王新玮 2016-2017-2 《Java程序设计》第5周学习总结
  11. Oracle JDBC配置
  12. 喜大普奔,Ant Design of Vue 1.0版本发布
  13. configure: The C compiler (located as /usr/bin/gcc) does not seem to be the required gcc compiler.
  14. 单片机c语言编程烧录软件,STC-ISP单片机烧录软件下载|好用的单片机编程器烧录软件_最火软件站...
  15. 【DEVOPS】SVN Server迁移 - 从VisualSvnServer到iF.SVNAdmin
  16. 我是SPI,我让框架更加优雅了!
  17. perl中tr的用法
  18. (转)当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 .
  19. Android实现有声计算器代码,有声语音计算器效果与代码
  20. 水星mercury无线扩展器设置

热门文章

  1. SOS关于组建星际物质研究自愿者协会的倡议
  2. npm create vite@latest 失败
  3. 转:标准差(Standard Deviation) 和 标准误差(Standard Error)
  4. 安卓手机格式化怎么弄_安卓手机怎么格式化
  5. java学生成绩分90及格_Java基础练习:题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示。 - 菜鸟头头...
  6. 计算机桌面分页,你的电脑桌面还会一团糟吗?这款软件可以帮你整理文件
  7. 后退N帧协议中发送窗口的尺寸大小
  8. 康奈尔笔记记录法[转
  9. 最新YYC松鼠聚合直播系统源码/融和电商商城等
  10. mysql+一直running_mysql 事务一直running问题排查