一定要在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 = 

所以如下图,在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]上。

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

 void dfsx(int x)
{
cout<<x<<" ";
for(int i=heap[x];i;i=a[i].next)
{
dfsx(a[i].to);
}
return;
}

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

EG

给定一棵有n个节点的树。
有两种操作:
.给u的子树上每点+v
.求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()

EG6

树剖模板。

我解决掉啦!

EG7

给定树,有点权。

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

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

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

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

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

换根意义下的操作

————to be continued

「咕咕网校 - 基础省选」树上问题的进阶 by Drench的更多相关文章

  1. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

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

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

  3. 2021.08.05 P7095 不离【扶咕咕出题】(贪心)

    2021.08.05 P7095 不离[扶咕咕出题](贪心) [P7095 yLOI2020] 不离 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 游戏中人物有两个属性,我 ...

  4. LuoGu P4996 咕咕咕

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  5. 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP

    [LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...

  6. luogu11月月赛T3咕咕咕(组合数学)

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  7. 「一入 Java 深似海 」系列课程

    第一期 「一入 Java 深似海 」系列课程 - 第一期 第一节:Java 语言基础

  8. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  9. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

随机推荐

  1. Codeforces Gym 100418K Cards 组合数学

    CardsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...

  2. java jvm学习

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  3. Linux下xz与tar的区别

    同一文件,tar.xz格式比tar.gz格式小了三分之一! 说明: xz是一个使用LZMA压缩算法的无损数据压缩文件格式. 和gzip与bzip2一样,同样支持多文件压缩,但是约定不能将多于一个的目标 ...

  4. android 图片的平移,缩放和旋转

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  5. kafka的安装和使用;kafka常用操作命令

    kafka:基于发布/订阅的分布式消息系统.数据管道:最初用来记录活动数据--包括页面访问量(Page View).被查看内容方面的信息以及搜索情况等内容和运营数据--服务器的性能数据(CPU.IO使 ...

  6. Python基础语法07--面向对象+正则表达式

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  7. 【转】 nginx rewrite 伪静态配置参数详细说明

    nginx rewrite 伪静态配置参数和使用例子 附正则使用说明 正则表达式匹配,其中: * ~ 为区分大小写匹配  * ~* 为不区分大小写匹配  * !~和!~*分别为区分大小写不匹配及不区分 ...

  8. Service具体解释(一):什么是Service

    < Service具体解释(一):什么是Service> < Service具体解释(二):Service生命周期> <Service具体解释(三):Service的使用 ...

  9. 【剑指offer】打印1到最大的n位数

    题目描写叙述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比方输入3,则打印出1.2.3一直到最大的3位数即999. 分析描写叙述: 首先想到的是先计算出最大的n位数是多少,然后用一个循环从1 ...

  10. apache多网站配置

    前言  虽说apache安装好后给了我们一个默认的一个网站.并且我们还能够将这个默认的网站改动成我们自己的网站.可是这似乎还不能全然满足我们的须要,由于当我们要在本机上开发(phpWeb)或者測试另外 ...